是否可以在symfony2中为路由创建默认参数值?

Yak*_*Yak 3 php url-routing symfony

我有一个使用注释在symfony2控制器中定义的路由.例如:

@Route("/{year}", name="show_list_for_user", defaults={ "year" = "2012" })
Run Code Online (Sandbox Code Playgroud)

是否可以使默认年份动态化.也许从服务对象中读取年份?

Kit*_*ten 7

您可以在RequestContext中设置默认参数.

当Symfony生成URL时,它按以下顺序使用值:

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

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

您可以在请求事件侦听器中设置上下文参数以覆盖Route默认值:

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'));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

服务配置:

<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>
Run Code Online (Sandbox Code Playgroud)

这取决于一个用例,如果你想使用动态默认生成url,请使用上面的代码.如果希望控制器在执行操作之前动态选择正确的默认值,则可以使用"kernel.controller"事件并设置请求属性(如果不存在).


Mae*_*lyn 2

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