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