【Laravel】1つのformに複数のボタンで処理を分岐させる

もくじ

複数ボタンの分岐

f:id:bonoponz:20200925151636p:plain

画像のような入力フォームに下書きボタンと送信ボタンがある場合、それぞれバックエンドの処理は異なります。

このように、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リクエストするときは脳死書きましょう。

bonoponz.hatenablog.com

コントローラー

// 入力フォームの表示
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でポストすると値を持ってコントローラーにやってくるので、値が存在している方が押されたボタンということになります。

動作確認

f:id:bonoponz:20200925151636p:plain

送信を押します。

おっ。コントローラーで書いた通りechoされましたね。

次に下書きボタンを押してみます。ぽち。

完璧〜!

ちゃんとボタンによって処理が分岐しました。

参考URL

HTTPリクエスト 7.x Laravel(入力値の存在チェック)

Laravelにて1つのFormで複数ボタンを実装する際の備忘録 | とりやる!