0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel】リクエスト・レスポンスを補完する

Last updated at Posted at 2020-07-12

こちらの記事は以下の書籍を参考に執筆しました

前回はミドルウェアの登録までやったので今回はグローバルミドルウェアをやっていく

#グローバルミドルウェア
前回は一つのミドルウェアに一つのアクセスで登録したがすべてのアクセスでミドルウェアを実行できるのはグローバルミドルウェア
##グローバルミドルウェアの登録
Kernel.phpの配列へ追記をして登録する

Http/Kernel.php
    protected $middleware = [
   ...
    ];

出典:PHPフレームワークLaravel入門 第2版

グローバルミドルウェアを登録すると個々のミドルウェアの呼び出しは必要無くなる。

web.php
Route::get('hello', 'HelloController@index')->middleware(HelloMiddleware::class);

出典:PHPフレームワークLaravel入門 第2版

これがこうなる

web.php
Route::get('hello', 'HelloController@index');

出典:PHPフレームワークLaravel入門 第2版

#ミドルウェアグループ登録
グループ化して登録する仕組み。
Kernel.phpの$middleGroupsという変数に設定されている。

Kernel.php
    protected $middlewareGroups = [
        'web' => [
        ..ミドルウェアクラス...
        ],

        'api' => [
        ..ミドルウェアクラス...
        ],
    ];

出典:PHPフレームワークLaravel入門 第2版

'web''api'という項目がグループ

##グループを利用する
グループに登録する際は、$middlewareに登録していたものを削除する必要がある。

配列に追加する。

Kernel.php
'hello'=>[\App\Http\Middleware\HelloMiddleware::class,],

出典:PHPフレームワークLaravel入門 第2版

web.phpを修正

web.php
Route::get('hello', 'HelloController@index')->middleware('hello');

出典:PHPフレームワークLaravel入門 第2版

グループの場合はmiddlewareの引数へグループ名をテキスト値で渡す。

#バリデーション
フォームなどでの値の検証をバリテーショという
##バリデーションとは
Larabelではvalidateメソッドを利用できる。
これはコントローラの基底クラスに組み込まれている。
ValidateRequestというトレイトの機能。

アクションメソッドからの呼び出しはこう

$this.->validate($request,[検証設定の配列]);

出典:PHPフレームワークLaravel入門 第2版

引数 説明
第1引数 リクエスト
第2引数 検証する設定情報の配列
配列はこんな感じ
[
  '項目名'=>'割り当てる検証ルール',
  '項目名'=>'割り当てる検証ルール',
   ....
]

出典:PHPフレームワークLaravel入門 第2版

##バリデーションの利用

inndex.blade.php
@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

出典:PHPフレームワークLaravel入門 第2版

コントローラを修正

    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'=>'正しく入力された']);
    }

出典:PHPフレームワークLaravel入門 第2版

indexメソッドは単純
バリデーション処理はpostメソッドでやってる。

web.php
Route::get('hello', 'HelloController@index');
Route::post('hello', 'HelloController@post');

出典:PHPフレームワークLaravel入門 第2版

POST送信されたときにpostメソッドが呼ばれるようにする。
その後/helloにアクセスして確認する。

##バリデーションの基本処理

      $validate_rule=[
        'name'=>'required',
        'mail'=>'email',
        'age'=>'numeric|between:0,150',
      ];

出典:PHPフレームワークLaravel入門 第2版

検証ルールはこの様になっている。
'age'=>'numeric|between:0,150',のようにルールは|で複数指定できる。
##バリデーションの実行
$this->validate($request,$validate_rule);
で実行している。

##エラーメッセージと値の保持
先の例ではどんなエラーが起きたのかわからない。何をどう変更すればいいのか、再入力の時に入力値の保持をやっていく

index.blade.php
@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

出典:PHPフレームワークLaravel入門 第2版

これでアクセスしてみると今度はエラーの表示がされる。

##エラーメッセージ表示の仕組み

@if(count($errors)>0)
<div >
  <ul>
    @foreach($errors->all() as $error)
    <li>{{$error}}</li>
    @endforeach
  </ul>
</div>
@endif

出典:PHPフレームワークLaravel入門 第2版

$errorsはバリデーションで発生したエラーメッセージをまとめて管理するオブジェクト
これはバリデーションの機能で組み込まれるため、コントローラで設定する必要はない。

これはエラーの表示をしている。

    @foreach($errors->all() as $error)
    <li>{{$error}}</li>
    @endforeach

出典:PHPフレームワークLaravel入門 第2版

$errors->all()でエラーメッセージを配列にまとめて取り出している。

##前回送信した値
これはのvalueに前回の値を設定すればいい。

value="{{old('name')}}"

出典:PHPフレームワークLaravel入門 第2版

oldメソッドを使っていて、これは引数に入力した項目の古い値を返す。
いずれもコントローラはいらずテンプレだけでできる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?