モジュールのルーティング設定について

We encourage users to post events happening in the community to the community events group on https://www.drupal.org.
nikaso's picture

はじめてカスタムモジュールを作っています(Drupal8.3)。手探りです。

"example.routing.yml"で以下のようにして、引数をとるようにしました。

example.content:
path: '/example/{var}'
defaults:
_controller: 'Drupal\example\Controller\ExampleController::content'
_title: 'example'
requirements:
_permission: 'access content'

引数がある場合はこれでうまくいきました。
コントローラーで引数に応じてクエリを作って必要な値を配列にして(全部コントローラーに書いて一応動いているんですがこれでよいのかいまいちわかっていません)twigテンプレートに渡しています。

引数がない場合(/example)にもデフォルト値を設定することはできますでしょうか?
具体的には、あらかじめ設定した候補の中から引数部分をランダムに選びそのページを表示したいです。

とりあえず、
example.content2:
path: '/example'
defaults:
_controller: 'Drupal\example\Controller\ExampleController::content2'
を追加して、引数をつけたURLにリダイレクトしたらいけたのはいけたのですが。何か全然ちがうような気がしてます。

どなたかアドバイスをいただければ幸いです。

Comments

blauerberg's picture

実現したいこと次第なのですが、いわゆるRestfulなルーティングでは、 /example は要素の集合を返し、 /example/{id} のようなURLでは単一の要素を返すことが多いです。

Webアプリケーションフレームワークを使って実装する場合、これらは別々のメソッドとして実装される事の方が多いです。例えば、Ruby On RailsやLaravelのscaffoldingでコードを自動生成した場合、ルーティングでは別々のメソッドが割り当てられているはずです。

そのため、個別にルーティングを定義するという方法で問題ないかと思います。

ちなみに、

defaults:
var: 1
..

のように書くと省略された際のデフォルト値を割り当てることは可能です。
ただし、この方法でコールバックは指定できなかったと思うので、
varがないURLにアクセスされた時に何かしらのロジックを動かすのであれば、やはりルーティングを別々に定義するほうが簡単かと思います。

nikaso's picture

早速のアドバイスありがとうございます!
今回は引数が省略された場合は動的に割り当てたいので、デフォルト値を設定するのではなく個別にルーティング定義する形で行きたいと思います。
とても参考になりました。ありがとうございました。