Laravelのルーティングについてまとめました。
まずここがわからないと何も表示させることができません。
だいたいは、こちらに書いてあることの抜粋です
初めに
環境
Laravel 8.x での情報になります。
廃止された機能についての記載はないので、古いバージョンを使っている方は注意してください。
Route
まず、すべてのルーティングの設定は routes/web.php に処理を記述します。
全部一つのファイルに集中するので、複数人で開発する場合は正直どうなんだろうという気もしますが、都度都度追加していくのではなく、最初から追加しておけばまぁ問題はないでしょう。
基本的構造
Route::get('/', function() { return 'Hoge' }); Route::get('/', function () { return view('welcome'); //Viewを指定する場合 });
基本的には、クロージャでreturnで返したものが出力されます。
ブラウザでみたらHogeとテキストで書いたものが表示されるはずです。
Viewを指定することもできます。
View指定
Route::view('URI', 'viewName'); //基本形 Route::view('/', 'hoge',['foo'=>'bar']); //パラメータも渡せる
これを使うとテンプレートファイルで成型した形で出力します。第2引数でViewを指定してします。
Viewファイルはbladeというテンプレートエンジンが使われます。
View(テンプレート)ファイルを置く場所は以下のようになっています。
/resources/views/[view名].blade.php
リダイレクト
Route::redirect('URI', 'URI', 301);
第3引数でHTTPステータスコードの指定ができます。
URLパラメータ
Route::get('users/{id}', function ($id) { }); //パラメータ必須 Route::get('users/{id?}', function ($id) { });//パラメータが無くても通す
RouteServiceProviderのboot()メソッドで以下のように書くとヴァリデーションができる。
public function boot() { Route::pattern('id', '[0-9]+');//正規表現で判定する }
ただ、名前がかぶっちゃう場合どうしたらいいのか不明。
被らないように一意になるようにしておいた方がよさげです。
CRUD(REST)
CRUD(クラッド)とは、ほとんど全てのコンピュータソフトウェアが持つ永続性[1]の4つの基本機能のイニシャルを並べた用語。その4つとは、Create(生成)、Read(読み取り)、Update(更新)、Delete(削除)である。ユーザインタフェースが備えるべき機能(情報の参照/検索/更新)を指す用語
wikipadiaより
RESTfullで書くとそれぞれこんな感じになります。
Route::get('books', 'BookController@index'); //一覧 Route::get('books/{book_id}', 'BookController@index'); //1冊取得 Route::post('books', 'BookController@post'); //新規追加 Route::put('books/{book_id}', 'BookController@put'); //修正 Route::delete('books/{book_id}', 'BookController@delete'); //削除
指定したHTTPメソッド以外は通さない書き方です。こんな書き方で複数のメソッドに対応した書き方もできます。
Route::any('hoge',function(){}); //全部通す Route::match(['get', 'post'], '/user/profile', function () {}); //指定したメソッドを通す
Resourcefulなルーティング
URIとコントローラーとの割り当てを一つ一つ書くのは、まぁ面倒ですよね。
Route::resource()を使うとこの辺の割り当てを自動でやってくれます
Route::resource('books', 'BookController');
URIとコントローラーとの割り当ては以下のようになります。
リクエスト | URI | アクション | ルート名 |
---|---|---|---|
GET | /books | index | books.index |
GET | /books/create | create | books.create |
POST | /books | store | books.store |
GET | /books/{book_id} | show | books.show |
GET | /books/{book_id}/edit | edit | books.edit |
PUT/PATCH | /books/{book_id} | update | books.update |
DELETE | /books/{photo} | destroy | books.destroy |
また、コントローラーですが、これもファイルをいちいち書くのは面倒ですよね。
artisanのmake:controllerを使うと雛形を作ってくれます。
# php artisan make:controller BookController --resource
このコマンドを打つと app/Http/Contollers/BookController.php が作成され、アクションメソッドが記述されたファイルができますので、これを基にするとよいかと思います。
詳しい使い方は後日まとめたいと思います。
まとめ
大まかな使い方は以上になります。
実際に使ってみての感想ですが、CakePHPを使っていた立場からすると、このルーティングの指定方法は正直いただけないかなぁと思います。
小規模で画面数が少なければよいと思いますが、管理画面見たいな画面数だけやたらと多いやつは大変そうだなと思いました。
CakePHPの場合も、ほぼ同様のルートを設定するファイルはありますが、規約通りのURIでよいのであれば/コントローラー名/メソッド名でアクセスできますので、いちいち書く必要はありません。
ですが、Laravelの場合は routes/web.php に何でもかんでも全部書かないといけないのは、正直どうなんだろうかと思います。特に、大規模、大人数で作るような大規模プロジェクトの場合問題が出そうです。いくらgitとかバージョン管理ソフトを使っていたとしても、1つのファイルをいじる人の人数は極力少なくしておいた方が競合が発生しにくいので良いと思います。
また、ネットを検索しているとRoute::controller()の説明が良く出てきますがこれは5.3で廃止されたようです。この機能を使えば、登録したコントローラーだけ登録しておけば、コントローラーで追加があってもroutesには追加で書く必要がなくて非常に楽だと思うんですがね。
この辺りが面倒なので、Route::resource() を使ったRESTful APIで実装して、フロントはVue.jsとかをつかってSPAで作ることが多いんだろうなぁと思います。
昨今の案件では、バックエンドにPHPを使ったものはほとんどがLaravelが多いのですが、セットでVue.jsなどのSPAのフロントエンドフレームワークが使われていますが、これが原因でないかなぁと思います。