在Sylius的ResourceController中创建自定义操作

问题描述

我有一个扩展了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