Controller - iruma-tea/laravel-base-11 GitHub Wiki

5. Controllerについて

コントローラーを作成し、ルーティングの設定することでLaravelアプリケーション
はリクエストを受けられるようになる

5.1. コントローラーの作成

コントローラを次のコマンドで作成する
php artisan make:controller Admin/BookController

5.2. ルーティングの設定

ルーティングとはクライアントからのリクエストを受けたさいどのコントローラーが処理を担当するかを指定すること。

URL リクエストメソッド コントローラー#メソッド
/admin/books GET BookController#index
/admin/books/{id} GET BookController#show

5.2.1. 現在のルーティングの確認

現在のルーティングの設定は以下のコマンドで確認できる。
php artisan route:list

5.2.2. ルーティングで利用可能なファサード

ファサード 説明
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']

5.2.3. ルートパラメータの制約

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の正規表現に従う値のみ許可する

5.2.4. 名前付きルート

ルーティングの設定には名前を付けること可能

  • 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>

5.2.5. グループ化

同じ指定のルーティング設定はグループ化することで、効率的に管理することができるようになる。
例えば、書籍関連の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');
    });

5.3. リクエスト

HTTP通信はリクエストから始まり、レスポンスで終わります。

5.3.1. HTTPのリクエスト

クライアントから送信されるリクエストには以下の情報が含まれる。

名前 概要
リクエストライン HTTPのバージョンやリクエストの種類、パラメータ
リクエストヘッダー クライアントの情報やリクエストに関する情報
リクエストボディ パラメータ

5.3.2. リクエストオブジェクト

リクエストを送信するビューを作成して、実際にパラメータ(主にクライアントが入力した情報)を取得する書籍登録機能を作成する。
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の情報を取得する

5.4. バリデーション

リクエストはクライアントが生成するもの。言い換えれば必ずしも欲しい値がくるとは限らない。
そのため、リクエストの内容はチェックが必要となる。
リクエストのチェックのことをバリデーションと言う。
Laravelにはバリデーションの方法がいくつかあるが、そのうちのFormRequestクラスを定義する方法を記載する。

5.4.1. FormRequestクラス

FormRquestクラスを作成するには以下のコマンドを実行する

  • php artisan make:request BookPostRequest
    BookPostRequestはクラス名。App/Http/Requestsフォルダに作成される。
    作成されたファイルにはauthorize、rulesメソッドの2つが自動生成される。

    • authorizeメソッドとは
      • ログイン中のユーザーが対象のレコードの更新権限を持っているかどうかなどを確認するメソッド。認証機能は未実装なので、固定値でtrueを返すようにする。
    • rulesメソッドとは
      • パラメータの内容に不正がないかを確認するメソッド。rulesメソッドは、バリデーションルールを設定した連想配列を返すようにする。
      • 連想配列にはキーに内容を確認したいパラメータ名前、値にバリデーションルールを記載する。

バリデーションルールに使用できる属性は以下のようなものがある。

ルール 内容
required 入力されていること
exists:categories,id カテゴリテーブルに存在するIDであること
unique:books 書籍テーブルのタイトルに存在しない値であること
max:100(文字列) 100文字以下であること
max:100(数値) 100以下であること
min:1(数値) 1以上であること
min:1(文字列) 1文字以上であること
numeric 数値であること
email メールアドレスのフォーマットであること
date 日付のフォーマットであること
boolean 真偽値のフォーマットであること(1、0、true、false)
array 配列であること
nullable nullを許容する

FormRequestクラスの利用(バリデーションの利用)

  • BookController#storeアクションのRequest引数を以下のように変更する
    • public function store(Request $request): Bookpublic function store(BookPostRequest $request): Book に変更する。
  • create.blade.phpにエラーメッセージを表示するよう実装する
    • バリデーションエラーの情報は $errors に代入されている。anyメソッドでエラーの有無を確認する。
    • エラー情報(コレクション)は **$errors->all()**で取得できる。

5.4.2. バリデーションメッセージの日本語化

バリデーションのエラーメッセージは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'

5.4.3. oldヘルパー

バリデーションエラーになると、入力された内容はクリアされる。
それではユーザーフレンドリーとは言えない。
Laravelではoldヘルパーを利用することで、セッションに保管されている入力内容を取り出すことができる。

5.5. レスポンス

レスポンスはクライアントに返却される情報のこと。
Laravelではコントローラーのメソッドの戻り値がレスポンスとしてクライアントに返却される。

5.5.1. レスポンスの種類

レスポンスとして返却可能な情報には主に次のようなものがある。

  • JSON
    Eloquentのモデルやコレクションを返却すると、JSON形式に変換される。
  • ビュー
    ビューを返却する場合、viewメソッドの第一引数にビューファイルのパス、第二引数にビューに
    渡したい値を連想配列の形で渡す。ビュー側では連想配列のキー名で値を参照する。
  • リダイレクト
    リダイレクトとはブラウザに、瞬時に新しいリクエストを送信させる命令のことです。
    • データベース更新後、画面に完了メッセージを表示することが多い。
      • 上記、機能を実装するには、メッセージをリダイレクト先に渡すにはwithメソッドを呼び出す。
        • 第一引数にはキー
        • 第二引数にはメッセージを設定する
      • viewからwithで指定した値が存在するかは、session('キー')で存在と値を出力する。

5.5.2. レスポンスオブジェクト

ヘッダーなど詳細な情報を設定する場合はレスポンスオブジェクトを使用する必要がある。
レスポンスオブジェクトはresponseメソッドで取得できる。

⚠️ **GitHub.com Fallback** ⚠️