LoginSignup
0
0

【Laravel6.x】authのバリデーション作成手順

Last updated at Posted at 2024-04-25

問題

auth(ログイン/新規登録/メール再設定)にバリデーションを適用させたい

前提条件

通常のバリデーションができていること

ログイン

手順

①コントローラー
②ビュー
③日本語化

①コントローラー

app/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php
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」は以下の手順で繋がっている。

web.php
Auth::routes();

app/Http/Controllers/Auth/LoginController.php
use Illuminate\Foundation\Auth\AuthenticatesUsers;

app/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php
email:filter

②ビュー

views/auth/login.blade.php
<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方が表示されなくなってしまうから。

③日本語化

resorces/lang/ja/validation.php
return [
    // ⭐️return内のバリデーション該当箇所を日本語にする
]

// ⭐️:attributeも修正する
// 「inputタグのname属性 => ‘表示名」にすることで上記return[]内の「:attribute」も日本語にできる。
'attributes' => [
    'email'=>'メールアドレス',
    'name'=>'ユーザー名',
    'password'=>'パスワード',
    'password_confirmation'=>'パスワード再入力',
    'amount'=>'金額',
    'title'=>'タイトル',
    'date'=>'日付',
    'file'=>'ファイル',
],

新規登録

手順

①コントローラー
②ビュー
③日本語化

①コントローラー

app/Http/Controllers/Auth/RegisterController.php
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」は以下の手順で繋がっている。

web.php
Auth::routes();

app/Http/Controllers/Auth/RegisterController.php
ここ

②ビュー

views/auth/register.blade.php
<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方が表示されなくなってしまうから。

③日本語化

resorces/lang/ja/validation.php
return [
    // ⭐️return内のバリデーション該当箇所を日本語にする
]

// ⭐️:attributeも修正する
// 「inputタグのname属性 => ‘表示名」にすることで上記return[]内の「:attribute」も日本語にできる。
'attributes' => [
    'email'=>'メールアドレス',
    'name'=>'ユーザー名',
    'password'=>'パスワード',
    'password_confirmation'=>'パスワード再入力',
    'amount'=>'金額',
    'title'=>'タイトル',
    'date'=>'日付',
    'file'=>'ファイル',
],

メール再設定(メール送信前)

手順

①コントローラー
②ビュー
③日本語化

①コントローラー

vendor/laravel/framework/src/Illuminate/Foundation/Auth/SendsPasswordResetEmails.php
protected function validateEmail(Request $request)
{
    $request->validate(['email' => 'required|string|email:filter']);
}

解説

「vendor/laravel/framework/src/Illuminate/Foundation/Auth/SendsPasswordResetEmails.php」は以下の手順で繋がっている。

web.php
Auth::routes();

app/Http/Controllers/Auth/ForgotPasswordController.php
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;

vendor/laravel/framework/src/Illuminate/Foundation/Auth/SendsPasswordResetEmails.php
protected function validateEmail(Request $request)
{
    $request->validate(['email' => 'required|string|email:filter']);
}

②ビュー

views/auth/passwords/email.blade.php
<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方が表示されなくなってしまうから。

③日本語化

resorces/lang/ja/validation.php
return [
    // ⭐️return内のバリデーション該当箇所を日本語にする
]

// ⭐️:attributeも修正する
// 「inputタグのname属性 => ‘表示名」にすることで上記return[]内の「:attribute」も日本語にできる。
'attributes' => [
    'email'=>'メールアドレス',
    'name'=>'ユーザー名',
    'password'=>'パスワード',
    'password_confirmation'=>'パスワード再入力',
    'amount'=>'金額',
    'title'=>'タイトル',
    'date'=>'日付',
    'file'=>'ファイル',
],

メール再設定(メールURLクリック後)

手順

①コントローラー
②ビュー
③日本語化

①コントローラー

vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords.php
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」は以下の手順で繋がっている。

web.php
Auth::routes();

app/Http/Controllers/Auth/ResetPasswordController.php
use Illuminate\Foundation\Auth\ResetsPasswords;

vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords.php
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',
    ];
}

②ビュー

resources/views/auth/passwords/reset.blade.php
<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方が表示されなくなってしまうから。

③日本語化

resorces/lang/ja/validation.php
return [
    // ⭐️return内のバリデーション該当箇所を日本語にする
]

// ⭐️:attributeも修正する
// 「inputタグのname属性 => ‘表示名」にすることで上記return[]内の「:attribute」も日本語にできる。
'attributes' => [
    'email'=>'メールアドレス',
    'name'=>'ユーザー名',
    'password'=>'パスワード',
    'password_confirmation'=>'パスワード再入力',
    'amount'=>'金額',
    'title'=>'タイトル',
    'date'=>'日付',
    'file'=>'ファイル',
],

参考サイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0