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"
]

と返してくれます。

By khino