为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
蛊毒传说 2023-10-15 15:20:39
在这个 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 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

我的控制器操作(带@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']


查看完整回答
反对 回复 2023-10-15
  • 1 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信