编程

自定义 Filament 根目录 ——避免 'Route [filament.admin.auth.login] not defined' 报错

84 2025-04-12 04:03:00

要在 Laravel 中创建后台管理面板,Filament 将帮你大大节省很多时间。在构建 CRUD 风格的后台应用时,它提供了许多样板文件。通常情况下,Filament 将在 admin 区域(/admin 等)中运行,而主应用则在域根目录上运行。但是,如果你想让整个应用作为 Filament 应用,并在应用根目录中运行呢?

更新 Filament 使之在域名根目录中运行

通常情况下,Filament 默认在 /admin 上运行。要对此进行修改很简单。跳转到 Filament 面板配置中如 App/Providers/Filament/AdminPanelProvider.php)并修改 path() 值: 

class AdminPanelProvider extends PanelProvider
{
    public function panel(Panel $panel): Panel
    {
        return $panel
            ->default()
            ->id('admin')
            // Change from 'admin' to '' to run on the root
            ->path('')
            ->login()
            ...

保存文件并重载应用,你应该可以看见原本在 /admin 上的功能现在在应用根目录上了。

路由错误

在 Laravel 的最新版本上这样做的一个障碍是,你很快就会在身份验证方面遇到错误。

Route [filament.admin.auth.login] not defined

当运行 php artisan route:list,你将看到一些 Filament 相关的 URL,不过 login 看起来很短。

...
GET|HEAD   login ............................................................................................. login
POST       logout .................................... filament.admin.auth.logout › Filament\Http › LogoutController
GET|HEAD   users ........ filament.admin.resources.users.index › App\Filament\Resources\UserResource\Pages\ListUsers
GET|HEAD   users/create filament.admin.resources.users.create › App\Filament\Resources\UserResource\Pages\CreateUser
...

原因是 Laravel 的默认认证和我们现在试图用 Filament 做的事情之间存在冲突。要解决这个问题,请转到 routes/web.php,并删除带有 ->name('login') 的路由。

Route::middleware('guest')->group(function () {
    // This is the one to get rid of!
    Volt::route('login', 'pages.auth.login')
        ->name('login');

删除此路由后,冲突消失了,Filament 可以处理登录了。再次生成路由列表确认登录现在是通过 Filament 进行处理:

...
GET|HEAD   login ................................................ filament.admin.auth.login › Filament\Pages › Login
POST       logout .................................... filament.admin.auth.logout › Filament\Http › LogoutController
GET|HEAD   users ........ filament.admin.resources.users.index › App\Filament\Resources\UserResource\Pages\ListUsers
GET|HEAD   users/create filament.admin.resources.users.create › App\Filament\Resources\UserResource\Pages\CreateUser
...

这是一个极其简单的修复,它允许你将 Filament 从 /admin 移动到域名根目录,而不会出现其他问题!