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

时间:2012-08-09 14:43:33

标签: php symfony url-routing

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

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

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

4 个答案:

答案 0 :(得分:7)

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

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

请参阅Symfony\Component\Routing\Generator\UrlGenerator::doGenerate

$mergedParams = array_replace($defaults,
                              $this->context->getParameters(),
                              $parameters);
  1. 用户提供的参数到generateUrl()函数
  2. 上下文参数
  3. route defaults
  4. 您可以在请求事件侦听器中设置上下文参数以覆盖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'));
            }
        }
    }
    

    服务配置:

    <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>
    

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

答案 1 :(得分:3)

这是不可能的,但确实存在变通方法。创建一个处理默认情况的附加控制器。

方法a - 转发请求

/**
 * @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;
}

答案 2 :(得分:2)

我担心这是不可能的,默认是静态的。

答案 3 :(得分:2)

默认使用占位符,例如

defaults={ "year" = "CURRENT_YEAR" }

然后在您的控制器中执行以下操作:

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