Laravelのパスワードリセットをカスタマイズする

Laravelのパスワードリセットをカスタマイズする

# やりたいこと

Laravelのパスワードリマインダーで、パスワードリセット画面でチェック項目を増やす。
ひみつの質問を増やして秘密の質問が合致しているときだけパスワードリセットを動作させる。


![pwr2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6384/5f00e33b-8750-22ae-39ae-6beba0295aec.png)


## ルートリストを確認

```bash
php artisan route:list
```
でルートを確認

```
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+------------+
| Domain | Method   | URI                    | Name             | Action                                                                 | Middleware |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+------------+
|        | POST     | password/reset         | password.update  | App\Http\Controllers\Auth\ResetPasswordController@reset                | web,guest  |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+------------+
```

この部分がパスワードリセット処理をするところ。
ResetPasswordControllerのresetメソッドが処理をしている。


## ResetPasswordController.phpをみてみる

```php
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ResetsPasswords;
use Illuminate\Http\Request;

class ResetPasswordController extends Controller
{
    use ResetsPasswords；

    /**
     * Where to redirect users after resetting their password.
     * @var string
     */
    protected $redirectTo = '/oreore/mypage';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }
}

```

reset関数はtraitで
Illuminate\Foundation\Auth\ResetsPasswordsのreset関数が呼ばれる。

ResetPasswordControllerに独自のreset関数を作って、先に自分の処理を実行させる。

ResetPasswordController.phpに以下の様に関数を追加。

```php

    public function reset(Request $request) {
        // カスタマイズしたい処理をここに書く

        // ・・・・ 略 ・・・・

        // オリジナルのパスワードリセットを呼ぶ
        return $this->original_reset($request);
    }
```

ResetPasswordController.phpのreset関数に別名を付ける。

```php

    // オリジナルのリセット関数に original_reset という名前を付ける
    use ResetsPasswords {
        ResetsPasswords::reset as original_reset;
    }

```

完成形のResetPasswordController.php

```php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ResetsPasswords;
use Illuminate\Http\Request;

class ResetPasswordController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Password Reset Controller
    |--------------------------------------------------------------------------
    |
    | This controller is responsible for handling password reset requests
    | and uses a simple trait to include this behavior. You're free to
    | explore this trait and override any methods you wish to tweak.
    | このコントローラはパスワードリセットのリクエストを処理する役割を担っており、
    | この動作を含めるためにシンプルな trait を使用しています。この trait を自由に調査し、
    | 調整したいメソッドをオーバーライドすることができます。
    |
    */

    // オリジナルのリセット関数に original_reset という名前を付ける
    use ResetsPasswords {
        ResetsPasswords::reset as original_reset;
    }

    /**
     * Where to redirect users after resetting their password.
     * パスワードリセット後のユーザーのリダイレクト先。
     * @var string
     */
    protected $redirectTo = '/oreore/mypage';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }


    public function reset(Request $request) {
        // カスタマイズしたい処理をここに書く

        // ・・・・ 略 ・・・・

        // オリジナルのパスワードリセットを呼ぶ
        return $this->original_reset($request);
    }
}


```