前回において、理想のバリデーションの関数、rules()を作成できたところで、今回は、そのバリデーションチェックを通過した入力データをDBに保存するところを見てみます。
なんのことはなく、$request->validate()がそのデータを返してくれるので、以下のように、返ってきた連想配列値をそのまま、create()あるいはupdate()に引数として渡せばいいのです。簡単ですね!
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use App\User;
class UserController extends Controller
{
public function rule(User $user = null)
{
// 共有するルール kana, mailcode, phone_with_dashはカスタムバリデーター
$rules = [
'name' => 'required',
'name_kana' => 'required|kana',
'mailcode' => 'required|mailcode',
'prefecture' => 'required',
'city' => 'required',
'address1' => 'required',
'phone' => 'required|phone_with_dash',
'password' => 'sometimes|required|min:8|max:20|confirmed',
'email' => [
'required',
'email',
Rule::unique('users')->ignore(optional($user)->id), //重複がないかチェック
]
];
return [
// rules
$rules,
// messages
[
'password.min' => '8から20文字長でお願いします',
'password.max' => '8から20文字長でお願いします'
]
// attributes
];
}
...
public function store(Request $request)
{
$validated = $request->validate(...$this->rules());
User::create($validated);
}
...
public function update(Request $request, User $user)
{
$validated = $request->validate(...$this->rules($user));
$user->update($validated);
}
...
}
しかし、ここで1つ問題です。画面には入力項目、住所2として、address2があります。項目は必須ではないので、上の例ではこれが保存されません。
これを解決するには、以下のようにルールにsometimesを使用して項目を作成すればいいですね。
...
public function rule(User $user = null)
{
// 共有するルール kana, mailcode, phone_with_dashはカスタムバリデーター
$rules = [
'name' => 'required',
'name_kana' => 'required|kana',
'mailcode' => 'required|mailcode',
'prefecture' => 'required',
'city' => 'required',
'address1' => 'required',
'address2' => 'sometimes|required',
'phone' => 'required|phone_with_dash',
'password' => 'sometimes|required|min:8|max:20|confirmed',
'email' => [
'required',
'email',
Rule::unique('users')->ignore(optional($user)->id), //重複がないかチェック
]
];
return [
// rules
$rules,
// messages
[
'password.min' => '8から20文字長でお願いします',
'password.max' => '8から20文字長でお願いします'
]
// attributes
];
}
...
メルマガ購読の申し込みはこちらから。
