2015-04-07 140 views
1

我有一个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', 
       ) 
      ) 
     ); 
    } 

,但我得到了以下错误:

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

Sylius控制器是服务,所以应该在'sylius.controller.product:createAction'格式中调用,而不是'Sylius:Product:create'。 – qooplmao

+0

添加这个答案作为我的男人:) – Kal

+0

出于好奇,从你可以看到,你可以做同样的事情,但对于资源控制器,所以你可以通过'sylius.controller.resource'来调用它。 – Kal

回答

1

Sylius控制器是服务,所以应该在sylius.controller.product:createAction格式中调用,而不是Sylius:Product:create

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

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

...这意味着你的前缀是app和资源名称将成为backendproducts甚至没有包含在命名中)。由于资源控制器的动作输出全部由路由信息控制,所以并不需要具有特定的控制器。如果需要为后端路由采取任何行动,您可以始终创建createBackendAction,但正如我所提到的,这可能不是必需的。