これが私が達成したいことであり、その後、私が得た知識のコンパイルが続きますが、解決策はありません.
Symfony2 プロジェクトでは、専用の bundle を使用せずに、パスの最初のディレクトリでロケールを定義したいと考えています。オプションである必要があります。
- 1. http://www.example.com/user/account => デフォルトのENロケール、ユーザーバンドル、アカウントコントローラー、デフォルトのインデックスアクション。
- 2. http://www.example.com/fr/user/account => 強制的なFRロケール...
- 3. http://www.example.com/en/user/account => 強制的なENロケール (デフォルトのロケールが EN であってもオプションが必要)
プロジェクトの最後には 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 年以来) が大好きですが、このフレームワークを使用すると、単純な問題が非常に複雑なソリューションを必要とすることに驚くことがあります。