簡體   English   中英

是否可以在symfony2中為路由創建默認參數值?

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

我有一個使用注釋在symfony2控制器中定義的路由。 例如:

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

是否可以使默認年份動態化。 也許從服務對象中讀取年份?

您可以在RequestContext中設置默認參數。

當Symfony生成URL時,它按以下順序使用值:

請參閱Symfony\\Component\\Routing\\Generator\\UrlGenerator::doGenerate

$mergedParams = array_replace($defaults,
                              $this->context->getParameters(),
                              $parameters);
  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'));
        }
    }
}

服務配置:

<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”事件並設置請求屬性(如果不存在)。

這是不可能的,但確實存在變通方法。 創建一個處理默認情況的附加控制器。

方法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;
}

我擔心這是不可能的,默認是靜態的。

用作默認的占位符,類似於

defaults={ "year" = "CURRENT_YEAR" }

然后在你的控制器做類似的事情:

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