3

アノテーションを使用してsymfony2コントローラーでルートを定義しています。例えば:

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

デフォルトの年を動的にすることは可能ですか?たぶん、サービスオブジェクトから年を読み取るのですか?

4

4 に答える 4

8

RequestContextでデフォルトのパラメータを設定できます。

SymfonyがURLを生成するとき、Symfonyは次の順序で値を使用します。

参照してくださいSymfony\Component\Routing\Generator\UrlGenerator::doGenerate

$mergedParams = array_replace($defaults,
                              $this->context->getParameters(),
                              $parameters);
  1. generateUrl()関数にユーザーが指定したパラメーター
  2. コンテキストパラメータ
  3. ルートのデフォルト

リクエストイベントリスナーでコンテキストパラメータを設定して、ルートのデフォルトを上書きできます。

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」イベントを使用し、存在しない場合は要求属性を設定できます。

于 2012-11-21T14:22:20.257 に答える
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;
}
于 2012-08-09T18:33:20.380 に答える
2

恐れ入りますが、デフォルトは静的です。

于 2012-08-09T14:50:55.153 に答える
2

デフォルトとしてプレースホルダーを使用します。

defaults={ "year" = "CURRENT_YEAR" }

次に、コントローラーで次のような操作を行います。

if ($year == "CURRENT_YEAR") {
    $year = //do something to find the current year
}
于 2012-08-09T15:36:16.810 に答える