8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

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

Mark Thomas 1月前

63 0

在此 Symfony 路由中/** * @Route(\'/board/{board}/card/{card}\', name=\'card_show\', methods={\'GET\'}, options={}) */public function show(Board $board, Card $card): Re...

在此 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。

谢谢。

帖子版权声明 1、本帖标题:如何以编程方式提供 Symfony 路由参数?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Mark Thomas在本站《symfony》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 为什么不以编程方式在路由中提供参数?我想摆脱必需的 board 参数,但我还想修饰 URI 以显示结构。这与 SEO 有关。

  • 有一个 UrlGenerator(接口)负责生成 URL。如果您执意要自己生成内容,也许您可​​以扩展它...或者您可以破解整个 Router(接口)

  • 这全都与期望有关。这里(php/symfony)的期望通常是,问题应该展示解决问题的努力,包括代码,也许是特定的错误消息,但这些都不适用于您的问题。因此,这个问题被认为是“懒惰的”,甚至可能因为各种原因而被关闭,例如固执己见/寻找资源。但要划定的界限是相当多变的,我可以理解你的想法。

  • 好的,经过一番调查,我发现了 这个问题 ,这让我找到了这个 有用的答案 .

    我的控制器操作(带有@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.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);
        }
    }
    

    现在,通过注入和使用卡片存储库,以编程方式提供缺少的参数 board 。要启用自定义路由器,您需要在 services.yaml 中注册它:

    App\Routing\CustomCardRouter:
        decorates: 'router'
        arguments: ['@App\Routing\CustomCardRouter.inner']
    
返回
作者最近主题: