问题描述
在这条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不再可用。
谢谢。
解决方法
好的,经过一番调查,我发现this question 导致我想到这个helpful answer。
我的控制器操作(带有margin-left: 0
注释)如下:
@Route
方法签名中只有一个参数(/**
* @Route("/board/{board}/card/{card}",name="card_show",methods={"GET"})
*/
public function show(Card $card): Response
{
}
),而路由中只有两个参数。
这是在树枝中调用路线的方法:
$card
由于自定义路由器,不需要path("card_show",{card: card.id})
参数。
自定义路由器的外观如下:
board
现在,通过注入和使用卡存储库以编程方式提供缺少的参数<?php // src/Routing/CustomCardRouter.php
namespace 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);
}
}
。要启用自定义路由器,您需要在services.yaml中对其进行注册:
board