もくじ
複数ボタンの分岐
画像のような入力フォームに下書きボタンと送信ボタンがある場合、それぞれバックエンドの処理は異なります。
このように、1つのformに複数のボタンがあり、ボタンそれぞれに処理を分けたい場合の方法をご紹介します。
ファイル構成
この3つのファイルを使って説明します。
ルーティング
Route::get('/form', 'IndexController@form')->name('form'); Route::post('/form', 'IndexController@post');
ページを表示する処理と、ボタンが押された時の処理を分けたいのでルーティングを分けています。
ビュー
フォームを作成します。
<form action="{{ route('form') }}" method="POST"> @csrf <div class="form-group"> <label for="formTitle" class="col-form-label">タイトル</label> <input type="text" class="form-control" id="formTitle" name="title" placeholder="タイトル"> </div> <div class="form-group"> <label for="formBody" class="col-form-label">本文</label> <textarea id="formBody" name="body" class="form-control" rows="5" placeholder="本文"></textarea> </div> <div class="form-group row justify-content-center"> <button type="submit" name="draft" class="btn btn-outline-primary mr-3">下書き</button> <button type="submit" name="send" class="btn btn-primary">送信</button> </div> </form>
今回のポイントは、<button>
タグにname
属性を指定しているところです。
name
属性を付加することによって、処理の分岐を可能にします。
CSRF対策
今回の余談ですが、@csrf
とはLaravelにおいてのCSRF対策です。
POSTリクエストするときは脳死で書きましょう。
コントローラー
// 入力フォームの表示 public function form(){ return view('form'); } // ボタンが押された時の処理 public function post(Request $request){ if($request->has('draft')){ echo('下書きにしました。'); } if($request->has('send')){ echo('送信しました。'); } return view('form'); }
ビューで設定したname
属性を使って、分岐をしています。
$request->has('xxx')
このように書くことで、Laravelがリクエストに値が存在するかを判定しています。xxx
の箇所にname
属性の値を指定します。
値が存在している場合はtrue
を返してくれます。
form
でポストすると値を持ってコントローラーにやってくるので、値が存在している方が押されたボタンということになります。
動作確認
送信を押します。
おっ。コントローラーで書いた通りecho
されましたね。
次に下書きボタンを押してみます。ぽち。
完璧〜!
ちゃんとボタンによって処理が分岐しました。
参考URL
HTTPリクエスト 7.x Laravel(入力値の存在チェック)