問題
auth(ログイン/新規登録/メール再設定)にバリデーションを適用させたい
前提条件
通常のバリデーションができていること
ログイン
手順
①コントローラー
②ビュー
③日本語化
①コントローラー
protected function validateLogin(Request $request)
{
$request->validate([
// username = return $request->only($this->username(), 'password');
// 下の方に記載あり
// email:filter = 平仮名、カタカナ、漢字、@の後にドットが最低一つなければバリデーションで弾く
$this->username() => 'required|string|email:filter|max:255',
'password' => 'required|string|min:8|max:50',
]);
}
解説
「app/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php」は以下の手順で繋がっている。
Auth::routes();
↓
use Illuminate\Foundation\Auth\AuthenticatesUsers;
↓
email:filter
②ビュー
<form class="mt-5" action="{{ route('login') }}" method="POST">
@csrf
<div class="form-group">
<label for="email">メールアドレス</label>
// ↓⭐️ここ value="{{ old('name属性') }} = バリデーションで引っかかってもデータが残る。再入力のだるさを解消。
<input type="text" class="form-control" id="email" name="email" placeholder="メールアドレスを入力" value="{{ old('email') }}">
// ↓⭐️ここ @error('name属性')
@error('email')
<div class="text-danger"><span>{{ $message }}</span></div>
@enderror
</div>
<div class="form-group">
<label for="password">パスワード</label>
<input type="password" class="form-control" id="password" name="password" placeholder="パスワードを入力">
// ↓⭐️ここ @error('name属性')
@error('password')
<div class="text-danger"><span>{{ $message }}</span></div>
@enderror
<small id="emailHelp" class="form-text text-muted text-right"><a href="{{ route('password.request') }}">※パスワードを忘れた方はこちら</a></small>
</div>
<div>
<button type="submit" class="btn btn-primary">ログインする</button>
<small id="emailHelp" class="form-text text-muted text-right"><a href="{{ route('register') }}">※会員登録はこちら</a></small>
</div>
</form>
ポイント
inputタグにフォームバリデーション「required」が合ったら外す
理由は、LaravelよりHTMLのバリデーションが優先されてLaravel方が表示されなくなってしまうから。
③日本語化
return [
// ⭐️return内のバリデーション該当箇所を日本語にする
]
// ⭐️:attributeも修正する
// 「inputタグのname属性 => ‘表示名」にすることで上記return[]内の「:attribute」も日本語にできる。
'attributes' => [
'email'=>'メールアドレス',
'name'=>'ユーザー名',
'password'=>'パスワード',
'password_confirmation'=>'パスワード再入力',
'amount'=>'金額',
'title'=>'タイトル',
'date'=>'日付',
'file'=>'ファイル',
],
新規登録
手順
①コントローラー
②ビュー
③日本語化
①コントローラー
protected function validator(array $data)
{
return Validator::make($data, [
// unique:users = 同じメアドの登録を弾く
'email' => ['required', 'string', 'email:filter', 'max:255', 'unique:users'],
'name' => ['required', 'string', 'max:20', ],
// confirmed = 確認用PWと「完全一致」ではない時に弾く
'password' => ['required', 'string', 'min:8', 'max:50', 'confirmed'],
'password_confirmation' => ['required', 'string', 'min:8', 'max:50'],
]);
}
解説
「app/Http/Controllers/Auth/RegisterController.php」は以下の手順で繋がっている。
Auth::routes();
↓
ここ
②ビュー
<form class="mt-5" action="{{ route('register') }}" method="POST">
@csrf
<div class="form-group">
<label for="email">メールアドレス</label>
// ↓⭐️ここ value="{{ old('name属性') }}
<input type="text" class="form-control" id="email" name="email" placeholder="メールアドレスを入力" autocomplete="email" value="{{ old('email') }}">
// ↓⭐️ここ @error('name属性')
@error('email')
<div class="text-danger"><span>{{ $message }}</span></div>
@enderror
</div>
<div class="form-group">
<label for="name">ユーザー名</label>
// ↓⭐️ここ value="{{ old('name属性') }}
<input type="text" class="form-control" id="name" name="name" placeholder="名前を入力" autocomplete="name" value="{{ old('name') }}">
// ↓⭐️ここ @error('name属性')
@error('name')
<div class="text-danger"><span>{{ $message }}</span></div>
@enderror
</div>
<div class="form-group">
<label for="password">パスワード</label>
<input type="password" class="form-control" id="password" name="password" placeholder="パスワードを入力">
// ↓⭐️ここ @error('name属性')
@error('password')
<div class="text-danger"><span>{{ $message }}</span></div>
@enderror
</div>
<div class="form-group">
<label for="password_confirmation">パスワード再入力</label>
<input type="password" class="form-control" id="password_confirmation" name="password_confirmation" placeholder="パスワードを再入力">
// ↓⭐️ここ @error('name属性')
@error('password_confirmation')
<div class="text-danger"><span>{{ $message }}</span></div>
@enderror
</div>
<div>
<button type="submit" class="btn btn-primary">新規登録する</button>
</div>
<small class="form-text text-muted text-right"><a href="{{ route('login') }}">※ログインへ戻る</a></small>
</form>
ポイント
inputタグにフォームバリデーション「required」が合ったら外す
理由は、LaravelよりHTMLのバリデーションが優先されてLaravel方が表示されなくなってしまうから。
③日本語化
return [
// ⭐️return内のバリデーション該当箇所を日本語にする
]
// ⭐️:attributeも修正する
// 「inputタグのname属性 => ‘表示名」にすることで上記return[]内の「:attribute」も日本語にできる。
'attributes' => [
'email'=>'メールアドレス',
'name'=>'ユーザー名',
'password'=>'パスワード',
'password_confirmation'=>'パスワード再入力',
'amount'=>'金額',
'title'=>'タイトル',
'date'=>'日付',
'file'=>'ファイル',
],
メール再設定(メール送信前)
手順
①コントローラー
②ビュー
③日本語化
①コントローラー
protected function validateEmail(Request $request)
{
$request->validate(['email' => 'required|string|email:filter']);
}
解説
「vendor/laravel/framework/src/Illuminate/Foundation/Auth/SendsPasswordResetEmails.php」は以下の手順で繋がっている。
Auth::routes();
↓
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
↓
protected function validateEmail(Request $request)
{
$request->validate(['email' => 'required|string|email:filter']);
}
②ビュー
<form method="POST" action="{{ route('password.email') }}">
@csrf
<div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
<div class="col-md-6">
// ↓⭐️ここ value="{{ old('name属性') }}"
<input id="email" type="text" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" autocomplete="email" autofocus>
// ↓⭐️ここ @error('name属性')
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
ポイント
inputタグにフォームバリデーション「required」が合ったら外す
理由は、LaravelよりHTMLのバリデーションが優先されてLaravel方が表示されなくなってしまうから。
③日本語化
return [
// ⭐️return内のバリデーション該当箇所を日本語にする
]
// ⭐️:attributeも修正する
// 「inputタグのname属性 => ‘表示名」にすることで上記return[]内の「:attribute」も日本語にできる。
'attributes' => [
'email'=>'メールアドレス',
'name'=>'ユーザー名',
'password'=>'パスワード',
'password_confirmation'=>'パスワード再入力',
'amount'=>'金額',
'title'=>'タイトル',
'date'=>'日付',
'file'=>'ファイル',
],
メール再設定(メールURLクリック後)
手順
①コントローラー
②ビュー
③日本語化
①コントローラー
protected function rules()
{
return [
'token' => 'required',
'email' => 'required|string|email:filter|max:255',
'password' => 'required|min:8|max:50|confirmed',
'password_confirmation' => 'required|string|min:8|max:50',
];
}
解説
「vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords.php」は以下の手順で繋がっている。
Auth::routes();
↓
use Illuminate\Foundation\Auth\ResetsPasswords;
↓
protected function rules()
{
return [
'token' => 'required',
'email' => 'required|string|email:filter|max:255',
'password' => 'required|min:8|max:50|confirmed',
'password_confirmation' => 'required|string|min:8|max:50',
];
}
②ビュー
<form method="POST" action="{{ route('password.update') }}">
@csrf
<input type="hidden" name="token" value="{{ $token }}">
<div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
<div class="col-md-6">
// ↓⭐️ここ value="{{ old('name属性') }}"
<input id="email" type="text" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ $email ?? old('email') }}" autocomplete="email" autofocus>
// ↓⭐️ここ @error('name属性')
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
<div class="col-md-6">
// ↓⭐️ここ value="{{ old('name属性') }}"
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" autocomplete="new-password">
// ↓⭐️ここ @error('name属性')
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password_confirmation" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>
<div class="col-md-6">
// ↓⭐️ここ value="{{ old('name属性') }}"
<input id="password_confirmation" type="password" class="form-control @error('password_confirmation') is-invalid @enderror" name="password_confirmation" autocomplete="new-password">
// ↓⭐️ここ @error('name属性')
@error('password_confirmation')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
ポイント
inputタグにフォームバリデーション「required」が合ったら外す
理由は、LaravelよりHTMLのバリデーションが優先されてLaravel方が表示されなくなってしまうから。
③日本語化
return [
// ⭐️return内のバリデーション該当箇所を日本語にする
]
// ⭐️:attributeも修正する
// 「inputタグのname属性 => ‘表示名」にすることで上記return[]内の「:attribute」も日本語にできる。
'attributes' => [
'email'=>'メールアドレス',
'name'=>'ユーザー名',
'password'=>'パスワード',
'password_confirmation'=>'パスワード再入力',
'amount'=>'金額',
'title'=>'タイトル',
'date'=>'日付',
'file'=>'ファイル',
],
参考サイト