3

私はまだ Symfony2 に慣れていないので、次の問題に頭を悩ませています。

次のルートが定義されたコントローラーにメインの参照アクションがあります(コントローラー内):

/**
 * @Route("/browse")
 * @Route("/browse/{page}")
 * @Route("/browse/c/{category}/{categoryName}")
 * @Route("/browse/c/{category}/{categoryName}/{page}")
 * @Route("/browse/c/{category}/b/{brand}/{page}")
 * @Route("/browse/b/{brand}")
 * @Route("/browse/b/{brand}/{page}")
 * @Template()
 */
public function browseAction($category = 0, $page = 1, $brand = 0) {

上記のルーティングは問題なく動作します。

問題は、twig ビューまたはビュー ヘルパーから URL を生成することです。

ビューヘルパーで次のことができるようにしたいと思います。

{{ url('browse', {'brand': '123'}) }}

これは、routing.yml の次のコードで問題なく動作します。

browse:
  pattern: /browse/b/{brand}
  defaults: { _controller: MyCoreBundle:Browse:browse } 

私はそれから試しました:

browse:
  pattern: /browse/b/{brand}
  pattern: /browse/c/{category}/b/{brand}
  defaults: { _controller: MyCoreBundle:Browse:browse } 

ただし、最後のパターンのみが適用されるようで、次を使用しようとするとエラーがスローされます。

{{ url('browse', {'brand': '123'}) }}

routing.yml で、一意の名前を付けた複数の個別のルートを作成できることに気付きました。しかし、それは、使用される変数に応じて、別のルート名を指定する必要があることを意味します。

私も試しました:

browse:
  pattern: /browse/c/{category}/b/{brand}/{page}
  defaults: { _controller: MyCoreBundle:Browse:browse } 

と:

{{ url('browse', {'brand': '123', 'category':'', 'page': '1'}) }}

しかし、それはカテゴリが正しい形式ではないというエラーをスローしました..

ここで何か不足していますか?誰かが私を正しい方向に向けることができますか? すべての変数を取り、入力に基づいて URL を構築できる twig 拡張機能を作成する必要があるのでしょうか?

4

3 に答える 3

1

ルートをデバッグすると、すべてのルート アノテーションが一意の名前を取得することがわかります

php app/console router:debug

アノテーションの name パラメーターを使用して、個々の名前を設定できます。ドキュメントを見てください。

@Route("/browse/{page}", name="browse_with_page") 

ケース専用の小枝拡張機能を作成することは、別の解決策になる可能性があります。または、このブログ投稿と言及が興味深いかもしれません。

編集:ページパラメーターはオプションになる可能性があるため、ルートを最小限に抑えることができます。

@Route("/browse/c/{category}/{categoryName}")
@Route("/browse/c/{category}/{categoryName}/{page}")

と同じで、両方の方法で呼び出すことができます。

@Route("/browse/c/{category}/{categoryName}/{page}", defaults={"page" = 1})

コンソールでテストすると、同じルートが一致するはずです。

php app:console router:match /browse/c/1/foobar
php app:console router:match /browse/c/1/foobar/2
于 2013-04-27T08:14:39.200 に答える
-2

まず、これは動的ルーティングではありません。これは、複数のパターンを持つスタティック ルーティングです。明確な違いがあります。

次に、パターンごとに固有の名前を付けて、パターンごとに明確に定義されたルートを作成する必要があります。ただし、ページ パラメータをデフォルトの 1 に設定してオプションにすることで、定義されるパターンの数を減らすことができます。

第 3 に、これらのリンクを twig で生成する必要がある場合は、上記で定義した一意の名前と必要なパラメーターを使用するだけです。

最後に、最後の例では、カテゴリは必須パラメーターであり、空白の値を渡しています。これにより、「/browse/c//b/123/1」が作成されます。これは、Symfony2 が処理する無効なルートです。

于 2013-09-23T01:22:23.500 に答える