是否有可能使默认参数值航线Symfony2的动态?(Is it possible to make t

2019-07-30 21:08发布

我在使用注释的Symfony2的控制器定义的路由。 例如:

@Route("/{year}", name="show_list_for_user", defaults={ "year" = "2012" })

是否有可能使使默认年动态。 也许从服务对象看一年?

Answer 1:

恐怕这是不可能的,默认是静态的。



Answer 2:

您可以在RequestContext的设置默认参数。

当Symfony的生成一个URL,它使用顺序值:

Symfony\Component\Routing\Generator\UrlGenerator::doGenerate

$mergedParams = array_replace($defaults,
                              $this->context->getParameters(),
                              $parameters);
  1. 用户提供的参数来generateUrl()函数
  2. 上下文参数
  3. 默认路由

您可以在一个请求事件侦听器上下文参数覆盖默认路径:

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Routing\RouterInterface;

class RequestListener
{
    private $_router;

    public function __construct(RouterInterface $router)
    {
        $this->_router = $router;
    }

    public function onRequest(GetResponseEvent $event)
    {
        $context = $this->_router->getContext();
        if (!$context->hasParameter('year')) {
            $context->setParameter('year', date('Y'));
        }
    }
}

服务配置:

<service id="my.request_listener"
         class="MyBundle\EventListener\RequestListener">

    <argument id="router" type="service"/>

    <tag name="kernel.event_listener"
         event="kernel.request" method="onRequest" />
</service>

这取决于使用的情况下,如果你想使用动态默认刚生成的网址,上面使用的代码。 如果你希望你的控制器执行行动之前,动态挑选合适的默认值,你也可能使用“kernel.controller”事件,并要求如果不存在属性。



Answer 3:

这是不可能的,但解决方法确实存在。 创建一个额外的控制器,它处理的默认情况。

方法 - 将请求转发

/**
 * @Route("/recent", name="show_recent_list_for_user")
 */
public function recentAction()
{
    $response = $this->forward('AcmeDemoBundle:Foo:bar', array(
        'year' => 2012,
    ));

    return $response;
}

方法B - 将请求重定向

/**
 * @Route("/recent", name="show_recent_list_for_user")
 */
public function recentAction()
{
    $response = $this->redirect($this->generateUrl('show_list_for_user', array(
        'year' => 2012,
    )));

    return $response;
}


Answer 4:

使用默认的占位符,像

defaults={ "year" = "CURRENT_YEAR" }

然后在你的控制器做这样的事情:

if ($year == "CURRENT_YEAR") {
    $year = //do something to find the current year
}


文章来源: Is it possible to make the default parameter values for routes dynamic in symfony2?