Переопределение контроллера ресурсов

У меня есть приложение Symfony, которое использует Sonata в качестве внутреннего администратора и платформу Sylius для управления продуктами.

Я создал свой собственный маршрут создания в методе configureRoutes класса администратора. Я хочу вызвать наш контроллер ресурсов (который будет использоваться для обработки всех объектов продукта) CRUD-методы из сонаты.

Вот мой метод configureRoutes:

    protected function configureRoutes(RouteCollection $collection)
    {
        $collection->add('create', 'create', array(
                '_controller' => 'AppBundle:Backend/Resource:createAction',
                '_sylius' => array(
                    'template' => 'AppBundle:Product/Backend/Form:CreateProduct.html.twig',
                    'redirect' => 'sylius_backend_product_show',
                )
            )
        );
    }

Но я получаю следующую ошибку:

введите описание изображения здесь

Мой resourceController расширяет контроллер ресурсов sylius:

namespace AppBundle\Controller\Backend;

use Sylius\Bundle\ResourceBundle\Controller\ResourceController as BaseController;
use Symfony\Component\HttpFoundation\Request;

/**
 * Class ResourceController
 * @package AppBundle\Controller\Backend
 */
class ResourceController extends BaseController
{
    /**
     * @param Request $request
     *
     * @return RedirectResponse|Response
     */
    public function createAction(Request $request)
    {   
        // Custom view logic
        return parent::createAction($request);
    }
}

Мое приложение / config.yml:

sylius_product:
    driver: doctrine/orm
    classes:
        product:
            model: AppBundle\Entity\Product
            controller: AppBundle\Controller\Backend\ResourceController
            form:
                default: AppBundle\Form\Type\ProductType
            translatable:
                targetEntity: AppBundle\Entity\ProductTranslation
        product_translation:
            model: AppBundle\Entity\ProductTranslation

sylius_resource:
    resources:
         app.backend.product:
             driver: doctrine/orm
             object_manager: default
             classes:
                 controller: AppBundle\Controller\Backend\ResourceController
                 model: AppBundle\Entity\Product

Как удовлетворить аргументы конструктора?


person Kal    schedule 07.04.2015    source источник
comment
Контроллеры Sylius - это службы, поэтому их следует вызывать в формате sylius.controller.product:createAction, а не Sylius:Product:create.   -  person qooplmao    schedule 07.04.2015
comment
Добавьте это в качестве ответа, мой мужчина :)   -  person Kal    schedule 07.04.2015
comment
Из любопытства, судя по тому, что вы видите, можете ли вы сделать то же самое, но для контроллера ресурсов, чтобы вы могли вызвать его с помощью sylius.controller.resource.   -  person Kal    schedule 07.04.2015
comment
Я не уверен, что понимаю тебя.   -  person qooplmao    schedule 07.04.2015


Ответы (1)


Контроллеры Sylius - это службы, поэтому их следует вызывать в формате sylius.controller.product:createAction, а не Sylius:Product:create.

Пакет ресурсов называет службы на основе имени вашего ресурса (app.backend.product), но имя создается как ...

list($prefix, $resourceName) = explode('.', $name);

... это означает, что ваш префикс будет app, а имя ресурса станет backend (products даже не будет включен в именование). Поскольку все выходные действия контроллеров ресурсов контролируются информацией о маршрутизации, в действительности нет необходимости в конкретном backend контроллере. Если бы какие-либо действия были необходимы только для внутренних маршрутов, вы всегда могли бы создать createBackendAction, хотя, как я уже упоминал, вероятно, в этом нет необходимости.

person qooplmao    schedule 07.04.2015