【Laravel 5.1】 ログインした状態でpassword/emailで出た不具合

[注意] うまくいかなかったので、この編集内容は消去。


5.1のデフォルトにおいては
認証した状態で
/password/emailへ
getリクエストを飛ばすと、
/home (welcome.blade.php)へリダイレクトしてしまう。

そこで、処置の1つとして
URI (/)に対するルーティングを以下のように変更した。
元々は、view関数(/vendor/laravel/framework/src/Illuminate/Routing/ResponseFactory.php)の第1引数に
('welcome')が渡される処理を、

コントローラの呼び出しを
AuthControllerに変更すると
リダイレクトループ(ERR_TOO_MANY_REDIRECTS [301])が
出てしまった。

[変更前] /app/Http/routes.php

Route::get('/', function () {
    return view('welcome');
});

[変更後] /app/Http/routes.php

Route::get('/', 'Auth\AuthController@getLogin')->name('auth.getLogin');


次に、 コントローラの呼び出しを

PostControllerに変更すると
[変更前] /app/Http/routes.php

Route::get('/', function () {
    return view('welcome');
});

[変更後] /app/Http/routes.php

Route::get('/', 'PostController@index')->name('posts.index');


URI」は「/」の状態で
「ページ表示」は「PostController@index」が表示されているという謎現象。

ソースコードを追って行ったら
犯人が判明。

<?php

namespace Illuminate\Foundation\Auth;

use Illuminate\Http\Request;
use Illuminate\Mail\Message;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Password;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

trait ResetsPasswords
{
    use RedirectsUsers;

    /**
     * Display the form to request a password reset link.
     *
     * @return \Illuminate\Http\Response
     */
    public function getEmail()
    {
        return view('auth.password');
    }

    /**
     * Send a reset link to the given user.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function postEmail(Request $request)
    {
        $this->validate($request, ['email' => 'required|email']);

        $response = Password::sendResetLink($request->only('email'), function (Message $message) {
            $message->subject($this->getEmailSubject());
        });

        switch ($response) {
            case Password::RESET_LINK_SENT:
                return redirect()->back()->with('status', trans($response));
            case Password::INVALID_USER:
                return redirect()->back()->withErrors(['email' => trans($response)]);
        }
    }

    /**
     * Get the e-mail subject line to be used for the reset link email.
     *
     * @return string
     */
    protected function getEmailSubject()
    {
        return property_exists($this, 'subject') ? $this->subject : 'Your Password Reset Link';
    }

    /**
     * Display the password reset view for the given token.
     *
     * @param  string  $token
     * @return \Illuminate\Http\Response
     */
    public function getReset($token = null)
    {
        if (is_null($token)) {
            throw new NotFoundHttpException;
        }

        return view('auth.reset')->with('token', $token);
    }

    /**
     * Reset the given user's password.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function postReset(Request $request)
    {
        $this->validate($request, [
            'token' => 'required',
            'email' => 'required|email',
            'password' => 'required|confirmed|min:6',
        ]);

        $credentials = $request->only(
            'email', 'password', 'password_confirmation', 'token'
        );

        $response = Password::reset($credentials, function ($user, $password) {
            $this->resetPassword($user, $password);
        });

        switch ($response) {
            case Password::PASSWORD_RESET:
                return redirect($this->redirectPath())->with('status', trans($response));
            default:
                return redirect()->back()
                            ->withInput($request->only('email'))
                            ->withErrors(['email' => trans($response)]);
        }
    }

    /**
     * Reset the given user's password.
     *
     * @param  \Illuminate\Contracts\Auth\CanResetPassword  $user
     * @param  string  $password
     * @return void
     */
    protected function resetPassword($user, $password)
    {
        $user->password = bcrypt($password);

        $user->save();

        Auth::login($user);
    }
}

トレイトRedirectsUsersのredirectPath()に
redirectToプロパティを入力していなかったので、
デフォルトでは「/home」にリダイレクトされるようになっていたから。

[RedirectsUsers.php]
/vendor/laravel/framework/src/Illuminate/Foundation/Auth/RedirectsUsers.php

<?php

namespace Illuminate\Foundation\Auth;

trait RedirectsUsers
{
    /**
     * Get the post register / login redirect path.
     *
     * @return string
     */
    public function redirectPath()
    {
        if (property_exists($this, 'redirectPath')) {
            return $this->redirectPath;
        }

        return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
    }
}

このトレイトを継承しているのは、以下の3つ。

trait AuthenticatesUsers
trait RegistersUsers
trait ResetsPasswords

このtrait ResetsPasswords周りを探っていく。

PasswordController.php

app\Http\Controllers\Auth\PasswordController.php

class PasswordController extends Controller
{
    use ResetsPasswords;
    protected $redirectTo = '/posts';

メソッドのオーバーライドをしてみよう

app\Http\Controllers\Auth\PasswordController.php

class PasswordController extends Controller
{
    use ResetsPasswords;

    /**
     * [2020.01.15] 
     * trait RedirectsUsersのredirectPath()メソッドをオーバーライドするため追加.
     */
    public function redirectPath()
    {
        if (property_exists($this, 'redirectPath')) {
            return $this->redirectPath;
        }

        return property_exists($this, 'redirectTo') ? $this->redirectTo : '/auth/login';
    }

/password/resetされたら「ログアウト処理」させたい。