首页 > 解决方案 > 在 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“/account/points/redeem”的控制器不可调用:类“Sylius\Bundle\ResourceBundle\Controller\ResourceController”上的预期方法“redeemAction”,您的意思是“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 操作?

标签: phpsymfonysylius

解决方案


我在 resource.yaml 中缺少控制器:

sylius_resource:
    resources:
        app.order_points:
            classes:
                model: App\Entity\Order\OrderPoints
                repository: App\Repository\OrderPointsRepository
                controller: App\Controller\OrderPointsController

推荐阅读