Создание пользовательского блока в Sonata Admin Bundle вызывает ошибку

проблема

Я использовал это решение /questions/39885244/kak-dobavit-polzovatelskuyu-ssyilku-ili-knopku-na-panel-upravleniya-sonataadminbundle-v-symfony2/39885253#39885253, но у меня возникает следующая ошибка при попытке открыть панель администратора (http://localhost/app_dev.php/admin/dashboard). Это происходит также после очистки кеша.

ClassNotFoundException: Попытка загрузить класс "AcmeBlockService" из пространства имен "Acme\ProductBundle\Block" в строке ~/htdocs/symfony2training/app/cache/dev/appDevDebugProjectContainer.php 2216. Вам нужно "использовать" его из другого пространства имен?

Кто-нибудь знает, где проблема?

Код

Вот часть моего app/config/config.yml

sonata_block:
    default_contexts: [cms]
    blocks:
        sonata.admin.block.admin_list:
            contexts:   [admin]
        sonata.user.block.menu:     # used to display the menu in profile pages
        sonata.user.block.account:  # used to display menu option (login option)
        acme.block.products:

sonata_admin:
    dashboard:
        blocks:
            # display a dashboard block
            - { position: left, type: acme.block.products }
            - { position: left, type: sonata.admin.block.admin_list }

Часть моей src/Acme/ProductBundle/Resources/config/services.yml

services:
    acme.block.products:
        id: acme.block.products
        class: Acme\ProductBundle\Block\ProductsBlockService
        arguments:
            - { name: service, id: templating }
        tags:
            - { name: sonata.block }

мой src/Acme/ProductBundle/Document/Products.php файл в:

<?php
namespace Acme\ProductBundle\Block;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Sonata\BlockBundle\Model\BlockInterface;
use Sonata\BlockBundle\Block\BlockContextInterface;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Validator\ErrorElement;
class ProductsBlockService extends BaseBlockService {
    public function getName() {
        return 'Products';
    }
    public function getDefaultSettings() {
        return array();
    }
    public function validateBlock(ErrorElement $errorElement, BlockInterface $block) {
    }
    public function buildEditForm(FormMapper $formMapper, BlockInterface $block) {
    }
    public function execute(BlockInterface $block, Response $response = null) {
        $settings = array_merge($this->getDefaultSettings(), $block->getSettings());
        return $this->renderResponse('AcmeProductBundle:Block:admin_products.html.twig', array(
                'block' => $block,
                'settings' => $settings
        ), $response);
    }
}

Решение

  1. Я заглянул в другой блок (vendor/sonata-project/user-bundle/Sonata/UserBundle/Block/AccountBlockService.php) и я понял, что его имя файла похоже на имя класса. Итак, я изменился src/Acme/ProductBundle/Document/Products.php в src/Acme/ProductBundle/Document/ProductsBlockService.php
  2. Это работает, но появилась другая ошибка:

    FatalErrorException: ошибка компиляции: объявление Acme\ProductBundle\Block\ProductsBlockService::execute() должно быть совместимо с Sonata\BlockBundle\Block\BlockServiceInterface::execute(Sonata\BlockBundle\Block\BlockContextInterface $blockContext, Symfony\Component\HttpFound Ответ $response = NULL) в строке ~/htdocs/symfony2training/src/Acme/ProductBundle/Block/ProductsBlockService.php 0

  3. Решение написано в сообщении об ошибке: Acme\ProductBundle\Block\ProductsBlockService::execute() должен быть совместим с Sonata \ BlockBundle \ Block \ BlockServiceInterface:: execute (). Поэтому я посмотрел в свой помощник (AccountBlockService.php из 1.), сравнить execute() методы и напишите мое собственное решение.

Итак, в конце концов мой src/Acme/ProductBundle/Document/ProductsBlockService.php Файл выглядит так, как показано ниже.

<?php
namespace Acme\ProductBundle\Block;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Validator\ErrorElement;
use Sonata\BlockBundle\Block\BaseBlockService;
use Sonata\BlockBundle\Block\BlockContextInterface;
use Sonata\BlockBundle\Model\BlockInterface;
use Sonata\UserBundle\Menu\ProfileMenuBuilder;
use Sonata\UserBundle\Model\UserInterface;
use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Security\Core\SecurityContextInterface;
class ProductsBlockService extends BaseBlockService {
    public function getName() {
        return 'Products';
    }
    public function validateBlock(ErrorElement $errorElement, BlockInterface $block) {
    }
    public function buildEditForm(FormMapper $formMapper, BlockInterface $block) {
    }
    public function setDefaultSettings(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'template' => 'AcmeProductBundle:Block:admin_products.html.twig',
            'ttl' => 0
        ));
    }
    public function execute(BlockContextInterface $blockContext, Response $response = null) {
        return $this->renderPrivateResponse($blockContext->getTemplate(), array(
                'block' => $blockContext->getBlock(),
                'context' => $blockContext,
            ), $response);
    }
}

0 ответов

Другие вопросы по тегам