こちらの記事は以下の書籍を参考に執筆しました
前回はミドルウェアの登録までやったので今回はグローバルミドルウェアをやっていく
#グローバルミドルウェア
前回は一つのミドルウェアに一つのアクセスで登録したがすべてのアクセスでミドルウェアを実行できるのはグローバルミドルウェア
##グローバルミドルウェアの登録
Kernel.phpの配列へ追記をして登録する
protected $middleware = [
...
];
グローバルミドルウェアを登録すると個々のミドルウェアの呼び出しは必要無くなる。
Route::get('hello', 'HelloController@index')->middleware(HelloMiddleware::class);
これがこうなる
Route::get('hello', 'HelloController@index');
#ミドルウェアグループ登録
グループ化して登録する仕組み。
Kernel.phpの$middleGroupsという変数に設定されている。
protected $middlewareGroups = [
'web' => [
..ミドルウェアクラス...
],
'api' => [
..ミドルウェアクラス...
],
];
'web'
と'api'
という項目がグループ
##グループを利用する
グループに登録する際は、$middlewareに登録していたものを削除する必要がある。
配列に追加する。
'hello'=>[\App\Http\Middleware\HelloMiddleware::class,],
web.phpを修正
Route::get('hello', 'HelloController@index')->middleware('hello');
グループの場合はmiddlewareの引数へグループ名をテキスト値で渡す。
#バリデーション
フォームなどでの値の検証をバリテーショという
##バリデーションとは
Larabelではvalidateメソッドを利用できる。
これはコントローラの基底クラスに組み込まれている。
ValidateRequestというトレイトの機能。
アクションメソッドからの呼び出しはこう
$this.->validate($request,[検証設定の配列]);
引数 | 説明 |
---|---|
第1引数 | リクエスト |
第2引数 | 検証する設定情報の配列 |
配列はこんな感じ |
[
'項目名'=>'割り当てる検証ルール',
'項目名'=>'割り当てる検証ルール',
....
]
##バリデーションの利用
@section('content')
<p>{{$msg}}</p>
<form action="/hello" method="post">
<table>
@csrf
<tr><th>name:</th><td><input type="text" name="name"></td></tr>
<tr><th>mail:</th><td><input type="text" name="mail"></td></tr>
<tr><th>age:</th><td><input type="text" name="age"></td></tr>
<tr><th></th><td><input type="submit" value="send"></td></tr>
</table>
</form>
@endsection
コントローラを修正
public function index(Request $request)
{
return view('hello.index',['msg'=>'フォームを入力']);
}
public function post(Request $request){
$validate_rule=[
'name'=>'required',
'mail'=>'email',
'age'=>'numeric|between:0,150',
];
$this->validate($request,$validate_rule);
return view('hello.index',['msg'=>'正しく入力された']);
}
indexメソッドは単純
バリデーション処理はpostメソッドでやってる。
Route::get('hello', 'HelloController@index');
Route::post('hello', 'HelloController@post');
POST送信されたときにpostメソッドが呼ばれるようにする。
その後/helloにアクセスして確認する。
##バリデーションの基本処理
$validate_rule=[
'name'=>'required',
'mail'=>'email',
'age'=>'numeric|between:0,150',
];
検証ルールはこの様になっている。
'age'=>'numeric|between:0,150',
のようにルールは|
で複数指定できる。
##バリデーションの実行
$this->validate($request,$validate_rule);
で実行している。
##エラーメッセージと値の保持
先の例ではどんなエラーが起きたのかわからない。何をどう変更すればいいのか、再入力の時に入力値の保持をやっていく
@section('content')
<p>{{$msg}}</p>
@if(count($errors)>0)
<div >
<ul>
@foreach($errors->all() as $error)
<li>{{$error}}</li>
@endforeach
</ul>
</div>
@endif
<form action="/hello" method="post">
<table>
@csrf
<tr><th>name:</th><td><input type="text" name="name" value="{{old('name')}}"></td></tr>
<tr><th>mail:</th><td><input type="text" name="mail" value="{{old('mail')}}"></td></tr>
<tr><th>age:</th><td><input type="text" name="age" value="{{old('age')}}"></td></tr>
<tr><th></th><td><input type="submit" value="send"></td></tr>
</table>
</form>
@endsection
これでアクセスしてみると今度はエラーの表示がされる。
##エラーメッセージ表示の仕組み
@if(count($errors)>0)
<div >
<ul>
@foreach($errors->all() as $error)
<li>{{$error}}</li>
@endforeach
</ul>
</div>
@endif
$errorsはバリデーションで発生したエラーメッセージをまとめて管理するオブジェクト
これはバリデーションの機能で組み込まれるため、コントローラで設定する必要はない。
これはエラーの表示をしている。
@foreach($errors->all() as $error)
<li>{{$error}}</li>
@endforeach
$errors->all()
でエラーメッセージを配列にまとめて取り出している。
##前回送信した値
これはのvalueに前回の値を設定すればいい。
value="{{old('name')}}"
oldメソッドを使っていて、これは引数に入力した項目の古い値を返す。
いずれもコントローラはいらずテンプレだけでできる。