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

と返してくれます。

メルマガ購読の申し込みはこちらから。

By khino