问题描述
我有一个扩展了ResourceController
的自定义控制器,我正在尝试创建一个自定义动作public function redeemAction(Request $request): Response
namespace App\Controller;
use Sylius\Bundle\ResourceBundle\Controller\ResourceController;
class OrderPointsController extends ResourceController
{
public function redeemAction(Request $request): Response {
}
}
这是我在sylius_shop.yaml中的路线
app_shop_account_redeem_points:
path: /account/points/redeem
methods: [POST]
defaults:
_controller: app.controller.order_points:redeemAction
还有resource.yaml:
sylius_resource:
resources:
app.order_points:
classes:
model: App\Entity\Order\OrderPoints
repository: App\Repository\OrderPointsRepository
通过POST访问路由时,出现此错误:
URI“ /帐户/积分/兑换”的控制器不可调用: 类上的预期方法“ redeemAction” “ Sylius \ Bundle \ ResourceBundle \ Controller \ ResourceController”,您是否 是“ createAction”,“ deleteAction”,“ indexAction”?
我知道资源控制器应该执行CRUD操作,但是某些核心Sylius文件也调用自定义操作:
sylius_shop_cart_summary:
path: /
methods: [GET]
defaults:
_controller: sylius.controller.order:summaryAction
_sylius:
template: "@SyliusShop/Cart/summary.html.twig"
form: Sylius\Bundle\OrderBundle\Form\Type\CartType
。
namespace Sylius\Bundle\OrderBundle\Controller;
class OrderController extends ResourceController
{
public function summaryAction(Request $request): Response
{
$configuration = $this->requestConfigurationFactory->create($this->Metadata,$request);
$cart = $this->getCurrentCart();
if (null !== $cart->getId()) {
$cart = $this->getorderRepository()->findCartById($cart->getId());
}
if (!$configuration->isHtmlRequest()) {
return $this->viewHandler->handle($configuration,View::create($cart));
}
$form = $this->resourceFormFactory->create($configuration,$cart);
$view = View::create()
->setTemplate($configuration->getTemplate('summary.html'))
->setData([
'cart' => $cart,'form' => $form->createView(),])
;
return $this->viewHandler->handle($configuration,$view);
}
...
}
在扩展资源控制器的自定义控制器中,是否有一种方法可以调用除预定义的CRUD操作以外的其他操作?
解决方法
我在resource.yaml中缺少控制器:
sylius_resource:
resources:
app.order_points:
classes:
model: App\Entity\Order\OrderPoints
repository: App\Repository\OrderPointsRepository
controller: App\Controller\OrderPointsController