[注意] うまくいかなかったので、この編集内容は消去。
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されたら「ログアウト処理」させたい。