はじめに
今回の記事では、PHPのフレームワークであるLaravelのルーティングやコントローラに関する基礎知識を紹介します。Laravelの基礎知識に関してはこちらをご覧ください。
ルーティング
Laravelのルートティングは、routesディレクトの web.php と api.php に定義します。
ルーティングの定義方法は3種類あり、1つ目はクラス名とメソッド名を記述する方法です。以下の例では、 /home 宛のリクエストを HomeController の index メソッドで処理します。
1 | Route::get('/home', 'HomeController@index'); |
2つ目はクラス名のみを指定する方法です。メソッド名を省略した場合は __invoke メソッドで処理します。
1 | Route::get('/home', 'HomeController@index'); |
3つ目はクロージャで記述する方法です。
1 2 3 | Route::get('/home', function () { return 'Hello World'; }); |
使用可能なメソッド
Laravelで使用できるメソッドは下記のとおりです。
1 2 3 4 5 6 | Route::get($uri, $callback); Route::post($uri, $callback); Route::put($uri, $callback); Route::patch($uri, $callback); Route::delete($uri, $callback); Route::options($uri, $callback); |
以下のように複数のメソッドに対応したルートを定義することもできます。
1 2 3 | Route::match(['get', 'post'], '/home', function () { return 'Hello, World' }); |
また、Route::any を使うとすべてのメソッドに対応したルートを定義することができます。
1 2 3 | Route::any('/home', function () { return 'Hello World' }); |
リダイレクト
他のURIにリダイレクトさせたい場合は Route::redirect を使います。
1 | Route::redirect('/before', '/after', 301); |
Viewの返却
コントローラ側で処理せずに特定のビューを返却すればよい場合は、 Route::view を使います。第2引数にはビュー名を渡します。ビューへデータを渡したい場合は第3引数に配列の形で渡します。
1 | Route::view('/top', 'top', ['title' => 'Top']); |
ルートパラメータ
CRUDの画面などのように、ルート中のURIセグメントを取得したい場合は以下のようにします。
1 2 3 | Route::get('post/{id}', function ($id) { return 'Post ID = '.$id; }); |
パラメータ名の後に ? をつけるとパラメータを省略することができます。この場合は、デフォルト値を設定する必要があります。
1 2 3 | Route::get('post/{id?}', function ($id = 1) { return 'Post ID = '.$id; }); |
ミドルウェア
ルートグループ内のすべてのルートにミドルウェアを指定するには Route::middleware メソッドを使用します。このとき、ミドルウェアは定義された順番で実行されます。
1 2 3 4 | Route::middleware(['mid1', 'mid2'])->group(function () { Route::get('/home', 'HomeController@index'); Route::get('/home{id}', 'HomeController@show'); }); |
プレフィックス
ルートグループ内のすべてのルートに特定のプレフィックスを指定するには Route::prefix メソッドを使用します。
1 2 3 4 | Route::prefix('admin')->group(function () { Route::get('users', 'UsersController@index'); Route::get('users/{id}', 'UsersController@show'); }); |
バリデーション
Laravelではコントローラ側でバリデーションを行います。バリデーションの方法は2種類あり、1つ目はコントローラに直接記述する方法で、2つ目はフォームリクエスに記述する方法です。
コントローラでバリデーション
コントローラでバリデーションする場合は以下のようになります。バリデーションに失敗した場合は例外が投げられます。
1 2 3 4 5 6 7 8 9 | public function store(Request $request) { $validatedData = $request->validate([ 'name' => 'required|max:32', 'email' => 'required|unique|max:255', ]); // バリデーション通過後の処理 } |
バリデーション失敗時に特定の処理をしたい場合は、以下のようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 | public function store(Request $request) { $validator = Validator::make($request->all(), [ 'name' => 'required|max:32', 'email' => 'required|unique|max:255', ]); if ($validator->fails()) { // バリデーション失敗時の処理 } // バリデーション通過後の処理 } |
フォームリクエストでバリデーション
フォームリクエストは以下のコマンドで作成できます。
1 | $ php artisan make:request UserPost |
フォームリクエストでバリデーションする場合は以下のようになります。
1 2 3 4 5 6 7 | public function rules() { return [ 'name' => 'required|max:32', 'email' => 'required|unique|max:255', ]; } |
また、エラーメッセージのカスタマイズは以下のようにします。
1 2 3 4 5 6 7 | public function messages() { return [ 'name.required' => '名前は必須です', 'email.required' => 'メールアドレスは必須です', ]; } |
さいごに
Laravelのルート定義とバリデーションの書き方を紹介しました。