猿问

如何以编程方式提供 Symfony 路由参数?

在这个 Symfony 路线中


/**

 * @Route("/board/{board}/card/{card}", name="card_show", methods={"GET"}, options={})

 */

public function show(Board $board, Card $card): Response

{

    $card->getLane()->getBoard(); // Board instance

    // ...

}

{board}既然参数已经在 中可用,如何以编程方式添加参数{card}?现在,在生成显示操作的链接时,我总是需要添加两个参数。

经过一番研究,我发现 RoutingAutoBundle ( https://symfony.com/doc/master/cmf/bundles/routing_auto/introduction.html#usage ) 可以提供我需要的功能,但它不再适用于 Symfony 5 。

谢谢。


蛊毒传说
浏览 86回答 1
1回答

蝴蝶刀刀

我的控制器操作(带@Route注释)如下所示:/** * @Route("/board/{board}/card/{card}", name="card_show", methods={"GET"}) */public function show(Card $card): Response{}$card我们在方法签名中只有一个参数 ( ),但在路由中只有两个参数。这是在 twig 中调用路由的方法:path("card_show", {card: card.id})无需board参数,这要归功于自定义路由器。这是自定义路由器的样子:<?php // src/Routing/CustomCardRouter.phpnamespace App\Routing;use App\Repository\CardRepository;use Symfony\Component\Routing\RouterInterface;class CustomCardRouter implements RouterInterface{    private $router;    private $cardRepository;    public function __construct(RouterInterface $router, CardRepository $cardRepository)    {        $this->router = $router;        $this->cardRepository = $cardRepository;    }    public function generate($name, $parameters = [], $referenceType = self::ABSOLUTE_PATH)    {        if ($name === 'card_show') {            $card = $this->cardRepository->findOneBy(['id' => $parameters['card']]);            if ($card) {                $parameters['board'] = $card->getLane()->getBoard()->getId();            }        }        return $this->router->generate($name, $parameters, $referenceType);    }    public function setContext(\Symfony\Component\Routing\RequestContext $context)    {        $this->router->setContext($context);    }    public function getContext()    {        return $this->router->getContext();    }    public function getRouteCollection()    {        return $this->router->getRouteCollection();    }    public function match($pathinfo)    {        return $this->router->match($pathinfo);    }}board现在,通过注入和使用卡存储库以编程方式提供缺少的参数。要启用自定义路由器,您需要在 services.yaml 中注册它:App\Routing\CustomCardRouter:    decorates: 'router'    arguments: ['@App\Routing\CustomCardRouter.inner']
随时随地看视频慕课网APP
我要回答