FormRequestの続きです。FormRequestは、ユーザーの入力をチェックしてくれるだけでなく、入力値も変えてくれることができます。
例えば、フォームにおいて以下のようなチェックボックスがあったとき、
<div class="form-group row"> <label for="subscribe" class="col-md-4 col-form-label text-md-right">メルマガを購読?</label> <div class="col-md-6"> <input id="subscribe" type="checkbox" class="form-control" name="subscribe" value="Y"> </div> </div>
チェックをオンにすれば、リクエストにはY(Yesの意味)の値が返ってきますが、チェックがオフなら何も値が返ってきません。
それゆえに、例えばチェックなしをDBにN(Noの意味)として保存したいなら、どうしましょう?
私のFormRequestの継承元のFormRequestのLaravelのコードを見ると、以下のようなメソッドがあります。
... /** * Get data to be validated from the request. * * @return array */ public function validationData() { return $this->all(); } ...
このメソッドを上書きして、
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class UserRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'name' => 'required', 'email' => 'required|email', 'subscribe' => 'string', // これを忘れずに! ]; } public function validationData() { $all = parent::validationData(); //値がないなら、'N'を入れる if (! $this->has('subscribe')) { $all['subscribe'] = 'N'; } return $all; } }
ルールにおいては、チェックボックスの項目(subscribe)のルールが必ず必要です。
こうすれば、
namespace App\Http\Controllers; use App\Http\Requests\UserRequest; class UserController extends Controller { public function __construct() { $this->middleware('auth'); } public function edit() { $user = auth()->user(); return view('user_edit')->with(compact('user')); } public function update(UserRequest $request) { dd($request->validated()); // デバッグ文を入れる auth()->user()->update($request->validated()); return redirect()->route('home'); } }
フォームでsubmitすると、上で入れたデバッグ文の実行は、
array:3 [▼ "name" => "kenji" "email" => "kenji@lotsofbytes.com" "subscribe" => "N" ]
と返してくれます。
メルマガ購読の申し込みはこちらから。