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" ] |
と返してくれます。
メルマガ購読の申し込みはこちらから。