条件分岐はおおきくきりわけたほうがよかったかもと
思いますが
これできるんだ...となったので記録です
きっかけ
リクエストユーザーに応じてフォームリクエストURLを変更したい
フォーム入力内容が同じなので、フォームは使いまわしたい
環境
laravel
viewにbladeを利用している
bladeテンプレートを利用
テンプレート設定はこちらにてまとめています
かんがえたこと
- formタグごと条件分岐で表示わけする
@if (Auth::user()->role === 'admin') <form method="post" action="{{ route('admin.label')}}"> {{ csrf_field() }} <label for="">ラベル名</label> <input type="text" name="label_name" value="{{ old('label_name') }}"> <button type="submit">送信</button> </form> @else <form method="post" action="{{ route('users.label')}}"> {{ csrf_field() }} <label for="">ラベル名</label> <input type="text" name="label_name" value="{{ old('label_name') }}"> <button type="submit">送信</button> </form> @endif @foreach ($errors->all() as $error) <p class="alert alert-danger">{!! nl2br(e($error)) !!}</p> @endforeach - jquery関数で条件分け
@section('js') <script> function requestSend(event, form) { event.preventDefault(); event.stopPropagation(); let user = <?php echo \Illuminate\Support\Facades\Auth::user() ?>; form = $(form); if (user.role === 'admin') { form.attr('action', "{{ route('admin.label') }}"); } else if (user.role === 'user') { form.attr('action', "{{ route('user.label') }}"); } form.removeAttr('onsubmit'); form.submit(); } </script> @endsection <form id="label_form" method="post" onsubmit="requestSend(event, $('#label_form'));"> {{ csrf_field() }} <label for="">ラベル名</label> <input type="text" name="label_name" value="{{ old('label_name') }}"> <button type="submit">送信</button> </form> @foreach ($errors->all() as $error) <p class="alert alert-danger">{!! nl2br(e($error)) !!}</p> @endforeach - formタグに条件分岐を追記
その1: 条件に応じてリクエスト先を変更その2: action属性を指定するのは条件一致時のみとする場合<form method="post" action="@if (Auth::user()->role === 'admin') {{route('admin.label')}} @else {{route('user.label')}} @endif"> {{ csrf_field() }} <label for="">ラベル名</label> <input type="text" name="label_name" value="{{ old('label_name') }}"> <button type="submit">送信</button> </form> @foreach ($errors->all() as $error) <p class="alert alert-danger">{!! nl2br(e($error)) !!}</p> @endforeach<form method="post" @if (Auth::user()->role === 'admin') action="{{route('admin.label')}}" @endif> {{ csrf_field() }} <label for="">ラベル名</label> <input type="text" name="label_name" value="{{ old('label_name') }}"> <button type="submit">送信</button> </form> @foreach ($errors->all() as $error) <p class="alert alert-danger">{!! nl2br(e($error)) !!}</p> @endforeach指定なしの場合、
"route('user.label')"にリクエストされるよう設定していることが前提
気づき
- 属性の定義自体を
@ifで分岐できる
→ 属性値の値を@if分岐で設定できることはドキュメントにも記載があったのだが定義そのものもできるとは思っていなかった - html内のタグ属性値にphpコードを含めるには""(ダブルクォーテーション)で囲む必要がある
参照