アノテーションを使用してsymfony2コントローラーでルートを定義しています。例えば:
@Route("/{year}", name="show_list_for_user", defaults={ "year" = "2012" })
デフォルトの年を動的にすることは可能ですか?たぶん、サービスオブジェクトから年を読み取るのですか?
アノテーションを使用してsymfony2コントローラーでルートを定義しています。例えば:
@Route("/{year}", name="show_list_for_user", defaults={ "year" = "2012" })
デフォルトの年を動的にすることは可能ですか?たぶん、サービスオブジェクトから年を読み取るのですか?
RequestContextでデフォルトのパラメータを設定できます。
SymfonyがURLを生成するとき、Symfonyは次の順序で値を使用します。
参照してくださいSymfony\Component\Routing\Generator\UrlGenerator::doGenerate
:
$mergedParams = array_replace($defaults,
$this->context->getParameters(),
$parameters);
リクエストイベントリスナーでコンテキストパラメータを設定して、ルートのデフォルトを上書きできます。
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」イベントを使用し、存在しない場合は要求属性を設定できます。
これは不可能ですが、回避策は存在します。デフォルトのケースを処理する追加のコントローラーを作成します。
/**
* @Route("/recent", name="show_recent_list_for_user")
*/
public function recentAction()
{
$response = $this->forward('AcmeDemoBundle:Foo:bar', array(
'year' => 2012,
));
return $response;
}
/**
* @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
}