覆盖资源控制器
Overriding resource controller
我有一个 Symfony 应用程序,它使用 Sonata 作为后端管理员,使用 Sylius 平台进行产品管理。
我已经在管理 class 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',
)
)
);
}
但是我得到以下错误:
我的 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
如何满足构造函数参数?
Sylius 控制器是服务,因此应以 sylius.controller.product:createAction
格式而不是 Sylius:Product:create
.
格式调用
资源包根据您的资源名称 (app.backend.product
) 命名服务,但生成的命名类似于...
list($prefix, $resourceName) = explode('.', $name);
...意味着您的前缀将是 app
,资源名称将变为 backend
(products
甚至不包含在命名中)。由于资源控制器操作输出全部由路由信息控制,因此实际上不需要特定的 backend
控制器。如果需要任何仅针对后端路由的操作,您总是可以创建 createBackendAction
,尽管正如我提到的,这可能没有必要。
我有一个 Symfony 应用程序,它使用 Sonata 作为后端管理员,使用 Sylius 平台进行产品管理。
我已经在管理 class 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',
)
)
);
}
但是我得到以下错误:
我的 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
如何满足构造函数参数?
Sylius 控制器是服务,因此应以 sylius.controller.product:createAction
格式而不是 Sylius:Product:create
.
资源包根据您的资源名称 (app.backend.product
) 命名服务,但生成的命名类似于...
list($prefix, $resourceName) = explode('.', $name);
...意味着您的前缀将是 app
,资源名称将变为 backend
(products
甚至不包含在命名中)。由于资源控制器操作输出全部由路由信息控制,因此实际上不需要特定的 backend
控制器。如果需要任何仅针对后端路由的操作,您总是可以创建 createBackendAction
,尽管正如我提到的,这可能没有必要。