[Laravel 5.7]ユーザー登録~確認後に元のページにリダイレクトさせる方法

php artisan route:listで登録時の処理を調べると

GET|HEAD | register | register | App\Http\Controllers\Auth\RegisterController@showRegistrationForm

POST | register | | App\Http\Controllers\Auth\RegisterController@register

となっています。

RegisterControllerでは

app/Http/Controllers/Auth/RegisterController.php

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;

class RegisterController extends Controller
{
    use RegistersUsers;

RegistersUsersトレイトを使っていてこの中にshowRegistrationForm()register()が書いてあります。

Illuminate/Foundation/Auth/RegistersUsers.php

<?php

namespace Illuminate\Foundation\Auth;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Auth\Events\Registered;

trait RegistersUsers
{
    use RedirectsUsers;

    /**
     * Show the application registration form.
     *
     * @return \Illuminate\Http\Response
     */
    public function showRegistrationForm()
    {
        return view('auth.register');
    }

    ...

    public function register(Request $request)
    {
        $this->validator($request->all())->validate();

        event(new Registered($user = $this->create($request->all())));

        $this->guard()->login($user);

        return $this->registered($request, $user)
                        ?: redirect($this->redirectPath());
    }

    ...

    protected function registered(Request $request, $user)
    {
        //
    }
}

register()の最後にregistered()が呼ばれるのですが、通常だと空のメソッドなのでnullを返しredirect($this->redirectPath())が返されます。

元のページにリダイレクトさせるにはshowRegistrationForm()registered()をオーバーライドします。

app/Http/Controllers/Auth/RegisterController.php

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Http\Request; //←これを忘れるとエラーが出ます。

class RegisterController extends Controller
{

    ...

    public function showRegistrationForm() {
        if(isset($_SERVER['HTTP_REFERER'])) {
            $intended = $_SERVER['HTTP_REFERER'];
        } else {
            $intended = '/';
        }
        
        session(['url.intended' => $intended]);
        return view('auth.register');
    }
    
    protected function registered(Request $request, $user) {
        return redirect('users/' . $user->id)->with('my_status', 'ユーザー登録はまただ完了していません。メールに記載されているリンクをクリックしてください。');
    }
}

元のURLは$_SERVER[‘HTTP_REFERER’]に格納されているので、session()url.intendedに登録します。
これをユーザー認証時に取りだしリダイレクト先に設定します。

※あまりないと思いますが、ユーザーがURL直打ちで登録ページにアクセスした場合、$_SERVER[‘HTTP_REFERER’]がUndefined Indexになるので、トップページにリダイレクトするようにします。

今回は、登録後のリダイレクト先は登録したユーザー自身のユーザーページ(users/{id})にします。
そして「ユーザー登録はまただ完了していません。メールに記載されているリンクをクリックしてください。」というフラッシュメッセージを表示させ、メールの確認を促します。

次に登録確認時の処理です。
登録確認にはVerificationControllerが使われます。
verify()メソッドが登録確認時に動いています。
これはVerifiesEmailsトレイトに書いてあるのでこれをオーバーライドします。

app/Http/Controllers/Auth/VerificationController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\VerifiesEmails;
use Illuminate\Http\Request;
use Illuminate\Auth\Events\Verified; //←これは忘れるとエラーが出ます。

class VerificationController extends Controller
{

    ...

    public function verify(Request $request)
    {
        if ($request->route('id') != $request->user()->getKey()) {
            throw new AuthorizationException;
        }

        if ($request->user()->hasVerifiedEmail()) {
            return redirect($this->redirectPath());
        }

        if ($request->user()->markEmailAsVerified()) {
            event(new Verified($request->user()));
        }

        $intended = session('url.intended');
        return redirect($intended)->with('my_status', 'ユーザー登録が完了しました。');
    }
}

$intendedに先ほどの元URLを代入します。
これをレダイレクト先に設定すれば完了です。

※フラッシュメッセージの表示ですが、今回は全てのページで継承しているblade(<header>などが書いてあります)に

@if (session('my_status'))
    <div class="container mt-2">
        <div class="alert alert-success">
            {{ session('my_status') }}
        </div>
    </div>
@endif

を追加しています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です