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のコードを見ると、以下のようなメソッドがあります。
vendor/laravel/framework/src/Illuminate/Foundation/Http/FormRequest.php
...
/**
* Get data to be validated from the request.
*
* @return array
*/
public function validationData()
{
return $this->all();
}
...
このメソッドを上書きして、
app/Http/Requests/UserRequest.php
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"
]
と返してくれます。