15

これが私が達成したいことであり、その後、私が得た知識のコンパイルが続きますが、解決策はありません.

Symfony2 プロジェクトでは、専用の bundle を使用せずに、パスの最初のディレクトリでロケールを定義したいと考えています。オプションである必要があります。

プロジェクトの最後には 100 を超えるルートがあり、ロケールはいつでも追加できることを考慮すると、すべてのロケール ルーティングを 1 回だけ記述する必要があります

1 つのルーティング ファイルでそれを達成する機会はありません。SF2.1 からの興味深い解決策は、ファビアン ポテンシエ自身によって説明されたチェーン ルーティング ファイルでした。1 つのファイルがロケールのプレフィックスとなり、通常のルーティングにチェーンされます。ここにいます:

最初のファイルには、ロケールを認識しないルートと、他のすべての通常のルートのロケールを認識するルーティング ファイルへのチェーンがリストされています。

--ルーティング.yml:

sys_ajax:
  resource: "@SystemAjax/InternalAjax/get"
  prefix:   /sysajax

locale_routing:
  resource: base_routing.yml
  prefix: /{_locale}
  defaults:
    _locale: fr

-- base_routing.yml:

user:
  resource: "@UserBundle/Resources/config/routing.yml"
  prefix:   /user

@BTUserBundle/Resources/config/routing.ymlは通常のバンドル ルーティング ファイルです。

パスにロケールを含む URL (例 2 および 3) では機能しますが、オプションのロケール部分を削除するとルートが見つかりません (例 1)。URL にロケール文字列がない場合、URL の「ユーザー」部分をロケールとしてキャプチャする {_locale} トークンが問題の原因であることは容易に推測できます。しかし、たとえば URL の最初の部分が en|fr|it|de でない場合、URL をそのままにして次のファイルにチェーンするように指示するにはどうすればよいでしょうか。

フォーラムからの解決策は、2 つのルートを作成することでした。

--ルーティング.yml:

sys_ajax:
  resource: "@SystemAjax/InternalAjax/get"
  prefix:   /sysajax

locale_routing:
  resource: base_routing.yml
  prefix: /{_locale}
  requirements:
    _locale: fr|en

locale_routing2:
  resource: base_routing.yml
  prefix: /
  defaults:
    _locale: fr

1 つのルールにはロケール部分があり、1 つにはありません。resource: base_routing.yml残念ながら、2つの行 (ルールごとに 1 つ) があり、後者が前者をオーバーライドするため、これは機能しません。

ここにいます、良い解決策はありません...

私は Symfony (2008 年以来) が大好きですが、このフレームワークを使用すると、単純な問題が非常に複雑なソリューションを必要とすることに驚くことがあります。

4

1 に答える 1

-1

いつでも他の方向から取り組むことができ、マクロを備えたまともなエディターを使用してルーティングファイルを作成できます. 手作業はほとんどなく、あなたが望むものを達成します。正規表現の置換やマクロを使用すると、簡単に変更できます。

于 2013-09-16T04:52:03.587 に答える