前提・実現したいこと
Laravelでユーザ情報の編集機能を実装しています。
エラーは出ていないのですが、フォームリクエストを利用してバリデーション
処理をしてから更新処理を想定しています。
ですが、バリデーションに失敗していないのにリダイレクトされて
入力画面に戻ってしまいます。
該当のソースコード
app/Http/MypageController
use Illuminate\Http\Request;
use App\Http\Requests\MypageRequest;
use App\Http\Requests\UserRequest;
class MypageController extends Controller { public function update(MypageRequest $request, $id) { try { $user = \App\User::findOrFail($id); // 保存処理 $user->name = $request->name; $user->email = $request->email; $user->save(); return redirect(route('mypage'))->with('flash_message', __('ユーザ情報を編集しました')); } catch (\Exception $e) { // エラー発生時は、ロールバック \DB::rollback(); throw $e; } } }
app/Http/Requests/MypageRequest
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; class MypageRequest 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', 'string', 'max:30'], 'email' => ['required', 'email:rfc,dns', Rule::unique('users')->ignore($this->id)], 'role' => ['required'], ]; } public function messages() { return [ "name.required" => "アカウント名は必須項目です。", "email.required" => "メールアドレスは必須項目です。", "email.email" => "正しいメールアドレスの形式で入力して下さい。", "comment.required" => "内容を入力して下さい。", "role.required" => "権限が選択されていません。", ]; } }
試したこと
"name" と"email"のrules()をコメントアウトすると
次の画面に遷移することが出来、入力エラー時も期待通りのバリデーションメッセージを
確認出来ています。
補足情報(FW/ツールのバージョンなど)
因果関係があるか定かではありませんが
app/Http/Requests ディレクトリの中にUserRequest.phpファイルがあり
そこのrules()と同じ処理を記載しています。
## app/Http/Requests/UserRequest namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; 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', 'string', 'max:30'], 'email' => ['required', 'email:rfc,dns', Rule::unique('users')->ignore($this->id)], //半角英数字をそれぞれ1種類以上含む6文字以上100文字以下の正規表現 'password' => ['required', 'string', 'min:6', 'confirmed', 'regex:/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{6,100}+\z/i'], 'password_confirmation' => ['required', 'string', 'min:6', 'regex:/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{6,100}+\z/i'], ]; } }
以上よろしくお願いします。
version Laravel 5.8
回答2件
あなたの回答
tips
プレビュー