Symfonyのドキュメントによると、以下のように定義されたルートは、/hello/bob
との両方に対して指定されたコントローラーをトリガーする必要があります/hello/bob/bobby
:
_hello:
path: /hello/{names}
defaults: { _controller: \Drupal\mymodule\Controller\Main::Controller }
requirements:
_access: 'TRUE'
names: .+
param へ/hello/bob/bobby
のリクエストの場合、{names}
"bob / bobby"(スラッシュはそのまま)であり、それを複数の変数に分割するか、単一の文字列のままにするかは、コントローラー次第です。そのトリックは、その{names}
パラメーターをフィルターするために使用される変更された正規表現( "。+")です。
このstackoverflowの投稿は、カスタムregexを使用してルートパラメータでスラッシュを許可できることも意味します(少なくともSymfony 2では)。
Drupal 8.0.0-beta15に対してこれを試しても機能せず、指定されたコントローラーはへの要求に対してのみトリガーされます/hello/bob
。しかし、私はこれがあることを確認することができますに使用し、以前のベータ版での仕事(私は〜beta13までだと思います)。
DrupalがSymfonyルーティングコンポーネントと統合する方法に、これを説明するような変更がありましたか?おそらく、ルーティングパラメータでスラッシュを渡す別の方法がありますか?コアでSymfony 3.0への動きがあることは知っていますが、それが説明できるかどうかはわかりません。
また、ルートサブスクライバーが動的ルート構造を管理できることも知っています。ただし、私が取り組んでいるケースでは、基本パスの最後にほぼ無限の組み合わせ/数の動的パラメーターが必要です(ただし、コントローラーで解析するのは簡単です)。また/hello?names[]=bob&names[]=bobby
、この場合はクエリ文字列(など)を回避しようとしています。
主に、Symfonyのドキュメントとの切断について混乱しています。
その他の注意事項
この質問を投稿した後、私はD8コア・キューにこの議論を発見しました:[ディスカッション]ドロップが追加の引数を渡すの自動化:Y / N。「メニューテール」サポート(基本的に私が求めているもの)は正式にD8で廃止されると結論付けているようです。その議論は3年前に終わったので、より一般化された実装の詳細の一部は最近まで完全に実現されていなかったと推測できます(〜beta13)。これが、この変更に気づいたのはなぜかを説明しているのかもしれません。
Drupal(Symfonyではない)が、symfony固有のルーティングロジックがルート(およびparam固有の正規表現など)をさらに分析する前に、スラッシュで区切られた生のリクエストに基づいて404応答を生成していると思います。この場合、上記の手法が機能しなくなった理由を説明できます。ただし、クエリパラメーターとカスタムルートサブスクライバーの使用を回避する、このニーズに対処する別の方法があるかどうかはまだ疑問です。