Laravel: パスワードリセット by Auth

#### 参考
[【laravel】メール(gmail)がエラーで送信出来ない問題](https://i-purple-u.com/2019/12/25/laravel-gmail/)
[Laravelパスワードリセットメールの文面・デザインを変更する](https://www.ritolab.com/entry/52)
[Laravel5.6でバリデーションなどのエラーメッセージを日本語化する方法](https://www.takafumitaba.com/laravel-error-messages)
[laravel-resources-lang-ja](https://github.com/minoryorg/laravel-resources-lang-ja#laravel-resources-lang-ja)
[Laravel 5.6 パスワードリセット](https://readouble.com/laravel/5.6/ja/passwords.html)
[php - Laravel 58でカスタムPasswordBroker sendResetLink（）メソッドを拡張または作成する方法は？](https://tutorialmore.com/questions-1112832.htm)

```php:.env
//メール送信設定
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME={address_id}@gmail.com
MAIL_PASSWORD={mail_pass}
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS={email_address}
MAIL_FROM_NAME={name}
```

ここまでで下記画面からのパスワードリセットメールが送信できるようになります。
![WS000007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455147/11825f35-bb72-d787-80cb-7de269d2c478.jpeg)
#### パスワードリセットメールのテンプレートビュー

```php:resource/views/mail/passwordreset.blade.php
//参考サイト様より
<!DOCTYPE html>
<html lang="ja">
<style>
  body { 
    background-color: #fffacd;
  }
  h1 {
    font-size: 16px;
    color: #ff6666;
  }
  #button {
    width: 200px;
    text-align: center;
  }
  #button a {
    padding: 10px 20px;
    display: block;
    border: 1px solid #2a88bd;
    background-color: #FFFFFF;
    color: #2a88bd;
    text-decoration: none;
    box-shadow: 2px 2px 3px #f5deb3;
  }
  #button a:hover {
    background-color: #2a88bd;
    color: #FFFFFF;
  }
</style>
<body>
<h1>
  パスワードリセット
</h1>
<p>
  以下のボタンを押下し、パスワードリセットの手続きを行ってください。
</p>
<p id="button">
  <a href="{{$reset_url}}">パスワードリセット</a>
</p>
</body>
</html>
```
#### 通知クラス（Notification）を継承するパスワードリセットクラスの作成

```console
$ php artisan make:notification PasswordResetNotification
```

```php:app/Notification/PasswordResetNotification.php
//追加
public $token;
protected $title = 'パスワードリセット 通知';

//変更
public function __construct($token)
{
    $this->token = $token;
}

public function toMail($notifiable)
{
    return (new MailMessage)
        ->subject($this->title)
        ->view('mail.passwordreset',
            [
                'reset_url' => url('password/reset', $this->token),
            ]);
}
```
#### 作成したPasswordResetNotificationクラスを利用するために。

```php:app/User.php
//追加
use App\Notifications\PasswordResetNotification;

//メソッドのオーバーライド
public function sendPasswordResetNotification($token)
{
    $this->notify(new PasswordResetNotification($token));
}

```

これでパスワードリセットできるようになります。

### カスタマイズ
#### 期限の変更設定

```php:config/auth.php
//expireオプションで設定
'passwords' => [                     
    'users' => [                     
        'provider' => 'users',       
        'table' => 'password_resets',
        'expire' => 30, // <- ココ
    ],                               
],                                   
```
#### パスワードリセット後のリダイレクト先
```php:app/Http/Controller/Auth/ResetPasswordController.php
//プロパティを変更
protected $redirectTo = '/home';
```

#### フラッシュメッセージの日本語化

```php:resource/lang/ja/password.php
<?php
    return [
        'password' => 'パスワードは6文字以上にして、確認用入力欄と一致させてください。',
        'reset' => 'パスワードは再設定されました！',
        'sent' => 'パスワード再設定用のURLをメールで送りました。',
        'token' => 'パスワード再設定用のトークンが不正です。',
        'user' => "メールアドレスに一致するユーザーが存在しません。",
    ];
```

#### メールアドレスが見つからなくても同じメッセージを出力
```php:app/Http/Controller/Auth/ForgetPasswordController.php
//追加
use Illuminate\Http\Request;
//オーバーライド
public function sendResetLinkEmail(Request $request)
{
    $this->validateEmail($request);
    $response = $this->broker()->sendResetLink(
        $request->only('email')
    );
    return back()->with('status', 'パスワード再設定用のURLをメールで送りました。');
}
```
LGTMお願いします！
ストックのついでにお願いします！
モチベーションがあがります！