简体   繁体   English

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

[英]Is it possible to make the default parameter values for routes dynamic in symfony2?

I have a route defined in a symfony2 controller using annotations. 我有一个使用注释在symfony2控制器中定义的路由。 EG: 例如:

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

Is it possible to make make the default year dynamic. 是否可以使默认年份动态化。 Maybe to read the year from a service object? 也许从服务对象中读取年份?

You can set default parameters in RequestContext. 您可以在RequestContext中设置默认参数。

When Symfony generates an URL, it uses values in this order: 当Symfony生成URL时,它按以下顺序使用值:

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

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

You can set the context parameters in a request event listener to override Route defaults: 您可以在请求事件侦听器中设置上下文参数以覆盖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 configuration: 服务配置:

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

It depends on a use case, if you want to use dynamic default just to generate url, use code above. 这取决于一个用例,如果你想使用动态默认生成url,请使用上面的代码。 If you want your controller to dynamically pick right default value before executing action, you could probably use 'kernel.controller' event and set request attributes if not present. 如果希望控制器在执行操作之前动态选择正确的默认值,则可能使用“kernel.controller”事件并设置请求属性(如果不存在)。

This is not possible, but workarounds do exist. 这是不可能的,但确实存在变通方法。 Create an additional controller which handles the default case. 创建一个处理默认情况的附加控制器。

Method a - forward the request 方法a - 转发请求

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

    return $response;
}

Method b - redirect the request 方法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;
}

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

Use as default a placeholder, something like 用作默认的占位符,类似于

defaults={ "year" = "CURRENT_YEAR" }

then in your controller do something like: 然后在你的控制器做类似的事情:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM