覆盖资源控制器

时间:2015-04-07 11:13:40

标签: php symfony sonata-admin sylius

我有一个Symfony应用程序,它使用Sonata作为后端管理员和Sylius产品管理平台。

我在admin类configureRoutes方法中创建了自己的创建路径。我想调用我们的资源控制器(将用于处理所有产品对象)来自sonata的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',
                )
            )
        );
    }

但是我收到以下错误:

enter image description here

我的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);
    }
}

我的app / 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

如何满足构造函数参数?

1 个答案:

答案 0 :(得分:1)

Sylius控制器是服务,因此应以sylius.controller.product:createAction格式而不是Sylius:Product:create调用。

资源包根据您的资源名称(app.backend.product)命名服务,但生成的命名类似于......

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

...意味着您的前缀为app,资源名称将变为backendproducts甚至不包含在命名中)。由于资源控制器操作输出全部由路由信息控制,因此实际上不需要具有特定的backend控制器。如果只需要为后端路线执行任何操作,您可以随时创建createBackendAction,但正如我所提到的,它可能没有必要。