kindle本「秘密のLaravel6」のまとめ。
点数
75点
感想
著者はLaravelにとても詳しく、使いこなしていることがよくわかる内容だった。
序盤はかなり勉強になることが多かったが、後半はひたすらサンプルプログラムの説明なので、読み飛ばした。
基本
セマンティックバージョン
Ver.6系からVer.6.0⇒Ver.6.1⇒Ver.6.2のような変更では後方互換性が保たれるようになった。
Laravelには
- laravel/laravel
- laravel/framework
- laravel/docs
の3つのリポジトリがあり、それぞれがバージョンを持っている。
composer create-project "laravel/laravel=6.*" MyApp --prefer-dist
で指定しているバージョンはlaravel/laravelのバージョンである。
- laravel/laravel:インストールした際のvendorを除いたファイル群、アプリのテンプレート。
- laravel/framework:Laravel本体。
例えば、laravel/frameworkに存在しlaravel/laravelに存在しないバージョン5.8.2を指定するとエラーになる。
laravel/frameworkはlaravel/laravelのcomposer.jsonのrequireでバージョンが指定されている。
日本語化
- https://readouble.com/laravel/6.x/ja/validation-php.htmlのソースを/resources/lang/ja/validation.phpとして保存し、 /config/app.phpのlocaleをjaにする。
- /config/app.phpのtimezoneをAsia/Tokyoにする。
- /config/app.phpのfaker_localをja_JPにする。
コントローラ
フォーム画面の初期値
フォーム画面は、以下の2つの値を初期値とする必要がある。
- バリデーションエラーの際に入力した値を初期値にする。
- 確認画面から戻ってきた際に入力値を初期値にする。
著者は以下のようにセッションを使って実装している。
public function index(User $user)
{
if ($data = old() ?: session('hoge')) {
$user->fill($data);
}
return view('index.form', compact('user'));
}
// ビューでは<input type="text" name="name" value="{{ $user->name }}">のようにする。
validateメソッドの戻り値
$this->validate()
や$request->validate()
の戻り値は、バリデーションを通過した項目だけを格納した配列である。
著者は以下のようにセッションに保存している。
$data = $request->validate([
'name' => 'required | max:255'],
'email' => 'required | max:255 | email |unique:users'],
]);
session(['hogehoge' => $data]);
App/Http/Controllers/Controllerクラス
全コントローラーで共通の処理を書く。
Illuminate\ではなく敢えてApp\にあるという事は、好きなように変更しても良いということ。
Requestクラスのonlyメソッド, allメソッド
$data = $request->only('name','email');
とすると、指定したパラメータだけを取得することができる。
ただし、存在しないパラメータ名を指定した場合、戻り値の配列にそのデータは含まれない。
例えば、emailが渡されていない場合、$data['email']
は存在しない。
※ Laravel5.5未満では、$data['email']
にnullがセットされていた$data = $request->all('name','email');
とすると、存在しないパラメータ名は戻り値の配列にnullとしてセットされる。
$request->all()
とすると全ての入力値を取得できるが、type=”file”のデータも含まれてしまう。request->input()
とするとtype=”file”のデータは含まれない。
通常は、type=”file”は別で処理をするので、request->all()を使うことはあまりないはず。
ダイナミックプロパティ$request->xxxはルートパラメータを返却しようとする
$request->xxx
のようにダイナミックプロパティを使ってパラメータを取得する場合、パラメータにxxxが存在しない場合はルートパラメータxxxを返却しようとするので注意が必要。$request->input('xxx')
を使った方が無難。
例えば、Route::get('user/{id}', UserController@hoge);
のようなルート定義がある中で$request->id
とした場合、まず$request->input('id')
や$request->file('id')
を返却しようとし、ない場合は$request->route('id')
を返却しようとする。
ビュー
@errorディレクティブ
@error('name')
<p>{{ $message }}</p>
@enderror
$messageには@errorで指定した要素のエラーメッセージが入っている。
パスワード項目
name属性がpasswordの場合はold()
にデータが渡されないようになっている。
(通常はパスワードの入力値を復元することはないが)
name属性をxxx_confirmationという名前にすると、バリデーションで確認用項目として扱うことができる。
これらの処理はapp/Exceptions/Handler.phpに書かれている。
バリデーション
必須ではない場合はnullableを指定する
$request->validate(['email' => 'email']);
とすると、入力が空の場合もエラーとなってしまう。
requiredかnullableを必ず指定するべき。
- 必須の場合:
$request->validate(['email' => 'required|email']);
- 必須でない場合:
$request->validate(['email' => 'nullable|email']);
必須系と一般系
バリデーションルールには必須系と一般系がある。
- 必須系:required, filled, present, nullableなど
- 一般系:max, boolean, integer, emailなど
必須系は必ずチェックが行われる。
一般系は項目が存在しない場合や空文字の場合はチェックされない。
ただし、nullの場合はチェックされる。(nullableがある場合はチェックされない)
filledルール
- 項目が存在する場合:入力必須
- 項目が存在しない場合:チェックしない
presentルール
- 項目が存在する場合:OK(空文字でもOK)
- 項目が存在しない場合:エラー
コメント