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