Controller - iruma-tea/laravel-base-11 GitHub Wiki
コントローラーを作成し、ルーティングの設定することでLaravelアプリケーション
はリクエストを受けられるようになる
コントローラを次のコマンドで作成する
php artisan make:controller Admin/BookController
ルーティングとはクライアントからのリクエストを受けたさいどのコントローラーが処理を担当するかを指定すること。
URL | リクエストメソッド | コントローラー#メソッド |
---|---|---|
/admin/books | GET | BookController#index |
/admin/books/{id} | GET | BookController#show |
現在のルーティングの設定は以下のコマンドで確認できる。
php artisan route:list
ファサード | 説明 |
---|---|
Route::get($uri, $callback); | 送信先が$uriであるGETリクエストの処理を決定する |
Route::post($uri, $callback); | 送信先が$uriであるPOSTリクエストの処理を決定する |
Route::put($uri, $callback); | 送信先が$uriであるPUTリクエストの処理を決定する |
Route::patch($uri, $callback); | 送信先が$uriであるPATCHリクエストの処理を決定する |
Route::delete($uri, $callback); | 送信先が$uriであるDELETEリクエストの処理を決定する |
Route::options($uri, $callback); | 送信先が$uriであるOPTIONSリクエストの処理を決定する |
Route::redirect($uri1, $uri2); | 送信先が$uri1であるリクエストを$uri2にリダイレクトする |
$callbackには処理を担当するメソッドまたは関数を指定する。
[BookController::class, 'show']
URLのルートパラメータのidには整数が代入されることが前提であるが、
パラメータはクライアント側が入力するので、文字列で指定されることが考えられる
whereNumberメソッドを使うことでパラメータは整数のみという制限をかけることができる
Route::get('admin/books/{id}', [BookController::class, 'show'])->whereNumber('id');
制限をかけるメソッドは他に以下のようなものがある
メソッド | 説明 |
---|---|
whereNumber('id') | ルートパラメータidに数値のみを許可する |
whereAlpha('id') | ルートパラメータidにアルファベットのみ許可する |
whereAlpahNumeric('id') | ルートパラメータidに数値かアルファベットのみを許可する |
whereIn('type', ['pc', 'phone']) | ルートパラメータtypeに'pc'か'phone'のみを許可する |
where('id', $reg) | ルートパラメータidに$regの正規表現に従う値のみ許可する |
ルーティングの設定には名前を付けること可能
Route::get('admin/books', [BookController::class, 'index'])->name('book.index');
Route::get('admin/books/{id}', [BookController::class, 'show'])->whereNumber('id')->('book.show');
書籍一覧のルーティング設定に**'book.index'**という名前を付けました。
名前をつけておくと、リンク先やリダイレクト先等を指定するさいに次のように名前で指定できるようになる。
<a href="{{ route('book.index') }}">書籍一覧</a>
同じ指定のルーティング設定はグループ化することで、効率的に管理することができるようになる。
例えば、書籍関連のURLはすべて頭にadmin/booksがついている。そのため、groupメソッド、prefixメソッドを使って
まとめて指定することができる。
- prefix('admin/books')でグループのURLを指定する
Route::prefix('admin/books')->group(function () {
Route::get('', [BookController::class, 'index'])->name('book.index');
Route::get('{id}', [BookController::class, 'show'])->whereNumber('id')->name('book.show');
});
- コントローラや名前付けを共通化
Route::prefix('admin/books')->name('book.')->controller(BookController::class)->group(function () {
Route::get('', 'index')->name('index');
Route::get('{id}', 'show')->whereNumber('id')->name('show');
});
HTTP通信はリクエストから始まり、レスポンスで終わります。
クライアントから送信されるリクエストには以下の情報が含まれる。
名前 | 概要 |
---|---|
リクエストライン | HTTPのバージョンやリクエストの種類、パラメータ |
リクエストヘッダー | クライアントの情報やリクエストに関する情報 |
リクエストボディ | パラメータ |
リクエストを送信するビューを作成して、実際にパラメータ(主にクライアントが入力した情報)を取得する書籍登録機能を作成する。
Laravelではビューをresources/viewsフォルダ内に保存する。
resources/views/admin/book フォルダに create.blade.phpを作成する。
- よく使われるリクエストオブジェクトから取得できる情報
取得方法 | 説明 |
---|---|
$request->path() | リクエストのパスを取得する('http://localhost/admin/book/create'なら'admin/book/create'を取得) |
$request->url() | リクエストの完全なURLを取得する |
$request->host() | リクエストのホストを取得する |
$request->method() | リクエストのメソッドを文字列で取得する |
$request->header('header') | ヘッダー内のキー名が'header'の値を取得する |
$request->file('file') | パラメータをファイルとして取得する |
$request->cookie('key') | Cookieの情報を取得する |
$request->session()->cookie('key') | Sessionの情報を取得する |
リクエストはクライアントが生成するもの。言い換えれば必ずしも欲しい値がくるとは限らない。
そのため、リクエストの内容はチェックが必要となる。
リクエストのチェックのことをバリデーションと言う。
Laravelにはバリデーションの方法がいくつかあるが、そのうちのFormRequestクラスを定義する方法を記載する。
FormRquestクラスを作成するには以下のコマンドを実行する
-
php artisan make:request BookPostRequest
BookPostRequestはクラス名。App/Http/Requestsフォルダに作成される。
作成されたファイルにはauthorize、rulesメソッドの2つが自動生成される。- authorizeメソッドとは
- ログイン中のユーザーが対象のレコードの更新権限を持っているかどうかなどを確認するメソッド。認証機能は未実装なので、固定値でtrueを返すようにする。
- rulesメソッドとは
- パラメータの内容に不正がないかを確認するメソッド。rulesメソッドは、バリデーションルールを設定した連想配列を返すようにする。
- 連想配列にはキーに内容を確認したいパラメータ名前、値にバリデーションルールを記載する。
- authorizeメソッドとは
バリデーションルールに使用できる属性は以下のようなものがある。
ルール | 内容 |
---|---|
required | 入力されていること |
exists:categories,id | カテゴリテーブルに存在するIDであること |
unique:books | 書籍テーブルのタイトルに存在しない値であること |
max:100(文字列) | 100文字以下であること |
max:100(数値) | 100以下であること |
min:1(数値) | 1以上であること |
min:1(文字列) | 1文字以上であること |
numeric | 数値であること |
メールアドレスのフォーマットであること | |
date | 日付のフォーマットであること |
boolean | 真偽値のフォーマットであること(1、0、true、false) |
array | 配列であること |
nullable | nullを許容する |
FormRequestクラスの利用(バリデーションの利用)
- BookController#storeアクションのRequest引数を以下のように変更する
-
public function store(Request $request): Book
⇒public function store(BookPostRequest $request): Book
に変更する。
-
- create.blade.phpにエラーメッセージを表示するよう実装する
- バリデーションエラーの情報は $errors に代入されている。anyメソッドでエラーの有無を確認する。
- エラー情報(コレクション)は **$errors->all()**で取得できる。
バリデーションのエラーメッセージはlang/en/validation.phpで管理されている。
Laravel10からlangフォルダがデフォルトでは作成されなくなったので、次のコマンドで作成する
- 作成コマンド
-
php artisan lang:publish
lang/en/validation.phpを含む、いくつかのファイルが生成される
-
- 日本語のメッセージを利用したい場合、lang/ja/validation.phpを作成する。(英語版をコピーして作成する)
- 言語の地域を日本語に設定する
- config/app.phpを編集する
'locale' => 'en' ⇒ 'locale' => 'ja'
- config/app.phpを編集する
バリデーションエラーになると、入力された内容はクリアされる。
それではユーザーフレンドリーとは言えない。
Laravelではoldヘルパーを利用することで、セッションに保管されている入力内容を取り出すことができる。
レスポンスはクライアントに返却される情報のこと。
Laravelではコントローラーのメソッドの戻り値がレスポンスとしてクライアントに返却される。
レスポンスとして返却可能な情報には主に次のようなものがある。
- JSON
Eloquentのモデルやコレクションを返却すると、JSON形式に変換される。 - ビュー
ビューを返却する場合、viewメソッドの第一引数にビューファイルのパス、第二引数にビューに
渡したい値を連想配列の形で渡す。ビュー側では連想配列のキー名で値を参照する。 - リダイレクト
リダイレクトとはブラウザに、瞬時に新しいリクエストを送信させる命令のことです。- データベース更新後、画面に完了メッセージを表示することが多い。
- 上記、機能を実装するには、メッセージをリダイレクト先に渡すにはwithメソッドを呼び出す。
- 第一引数にはキー
- 第二引数にはメッセージを設定する
- viewからwithで指定した値が存在するかは、
session('キー')
で存在と値を出力する。
- 上記、機能を実装するには、メッセージをリダイレクト先に渡すにはwithメソッドを呼び出す。
- データベース更新後、画面に完了メッセージを表示することが多い。
ヘッダーなど詳細な情報を設定する場合はレスポンスオブジェクトを使用する必要がある。
レスポンスオブジェクトはresponseメソッドで取得できる。