Filament Registration: Customize Redirect Page

2024-10-10

Sometimes, you may wish to redirect users after registration to a different resource or page instead of a dashboard. But how is that done? Do you have to build a custom registration page? No! There's a much easier way.


Single Panel Redirect

If you have just one panel in your filament application, you can implement the redirect as follows:

Create a new file app/Http/Responses/RegisterResponse.php with the following contents:

namespace App\Http\Responses;
 
use App\Filament\Resources\OrderResource;
use Illuminate\Http\RedirectResponse;
use Livewire\Features\SupportRedirects\Redirector;
 
class RegisterResponse extends \Filament\Http\Responses\Auth\RegistrationResponse
{
public function toResponse($request): RedirectResponse|Redirector
{
// Here, you can define which resource and which page you want to redirect to
return redirect()->to(EmployeeResource::getUrl());
}
}

Then all we have to do is modify the Singleton:

app/Providers/AppServiceProvider.php:

use Filament\Http\Responses\Auth\Contracts\RegistrationResponse;
use Illuminate\Support\ServiceProvider;
// ...
 
public function register(): void
{
$this->app->singleton(
RegistrationResponse::class,
\App\Http\Responses\RegisterResponse::class
);
}

That's it! When a user register, the filament will attempt to return RegistrationResponse internally, but we just changed the implementation to our own, which redirects to the order resource.


Multiple Panel Redirect

You can implement the redirect per panel if you have multiple panels in your filament application! Here's how:

Create a new file app/Http/Responses/RegisterResponse.php with the following contents:

use App\Filament\Customer\Resources\MyOrdersResource;
use App\Filament\Resources\OrderResource;
use Filament\Facades\Filament;
use Illuminate\Http\RedirectResponse;
use Livewire\Features\SupportRedirects\Redirector;
 
class LoginResponse extends \Filament\Http\Responses\Auth\LoginResponse
{
public function toResponse($request): RedirectResponse|Redirector
{
// You can use the Filament facade to get the current panel and check the ID
if (Filament::getCurrentPanel()->getId() === 'admin') {
return redirect()->to(OrderResource::getUrl('index'));
}
 
if (Filament::getCurrentPanel()->getId() === 'customer') {
return redirect()->to(MyOrdersResource::getUrl('index'));
}
 
return parent::toResponse($request);
}
}

Then all we have to do is modify the Singleton:

app/Providers/AppServiceProvider.php:

use Filament\Http\Responses\Auth\Contracts\RegistrationResponse;
use Illuminate\Support\ServiceProvider;
// ...
 
public function register(): void
{
$this->app->singleton(
RegistrationResponse::class,
\App\Http\Responses\RegisterResponse::class
);
}

That's it! Now each panel will redirect to a different resource after registration.

A few of our Premium Examples: