Laravel 8 (JetStream/Fortify) Registration & Login Redirect

Laravel 8 (JetStream/Fortify) Registration & Login Redirect

American IT

Всем прекрасен и хорош JetStream (c Fortify внутри). Но пока что эта конструкция не поддерживает кастомизацию редиректа после регистрации или авторизации в новых проектах Laravel 8. Ниже временное решение... Погнали!

UPD: Более простое решение ;)

В файле RouteServiceProvider.php на 20-й строке поменяйте путь. Все.

***

Создайте каталог Responses внутри app\Http.

Внутри создайте файл LoginResponse.php:

<?php

namespace App\Http\Responses;

use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;

class LoginResponse implements LoginResponseContract
{
    public function toResponse($request)
    {
        return $request->wantsJson()
            ? response()->json(['two_factor' => false])
            : redirect()->intended(config('fortify.registered'));
    }
}

Точно также создайте файл RegisterResponse.php:

<?php

namespace App\Http\Responses;

use Laravel\Fortify\Contracts\RegisterResponse as RegisterResponseContract;

class RegisterResponse implements RegisterResponseContract
{
    public function toResponse($request)
    {
        return $request->wantsJson()
            ? response()->json(['two_factor' => false])
            : redirect()->intended(config('fortify.registered'));
    }
}

Теперь нужно заставить Laravel использовать наши собственные Response Class.

Этот новый класс заменяет синглтон, ранее зарегистрированный Fortify. Отредактируйте JetstreamServiceProvider внутри app\Providers. В метод boot() добавьте референс на ваш новый класс. Он будет срабатывать когда логин завершен и юзер уже авторизован:

public function boot()
{
    $this->configurePermissions();
    Jetstream::deleteUsersUsing(DeleteUser::class);

    //Register new LoginResponse
    $this->app->singleton(
        \Laravel\Fortify\Contracts\LoginResponse::class,
        \App\Http\Responses\LoginResponse::class
    );
}

Если вы юзаете двухфакторку (2FA), то ее тоже надо добавить:

public function boot()
{
    $this->configurePermissions();
    Jetstream::deleteUsersUsing(DeleteUser::class);

    //Register new LoginResponse
    $this->app->singleton(
        \Laravel\Fortify\Contracts\LoginResponse::class,
        \App\Http\Responses\LoginResponse::class
    );

    //Register new TwofactorLoginResponse
    $this->app->singleton(
        \Laravel\Fortify\Contracts\TwoFactorLoginResponse::class,
        \App\Http\Responses\LoginResponse::class
    );
}

Аналогично для регистрации:

public function boot()
{
    $this->configurePermissions();
    Jetstream::deleteUsersUsing(DeleteUser::class);

    //Register new LoginResponse
    $this->app->singleton(
        \Laravel\Fortify\Contracts\LoginResponse::class,
        \App\Http\Responses\LoginResponse::class
    );

    //Register new TwofactorLoginResponse
    $this->app->singleton(
        \Laravel\Fortify\Contracts\TwoFactorLoginResponse::class,
        \App\Http\Responses\LoginResponse::class
    );

    //Register new RegisterResponse
    $this->app->singleton(
        \Laravel\Fortify\Contracts\RegisterResponse::class,
        \App\Http\Responses\RegisterResponse::class
    );
}

Далее, откройте файл config/fortify.php и в нем допишите параметр:

'registered' => '/home'

(ну или куда вам там надо юзера редиректить).

Ждем пока JetStream (или Fortify) сделают возможность кастомно редиректить юзеров куда нам надо, как это было в laravel/ui. А пока вот такой костыль.

Всех жду в своем чатике ;)

Report Page