在 Filament 应用中,您可能希望从 Filament 资源或自定义页面添加按钮/链接到其他页面。但是在 Filament 中我并没有找到显式的路由定义文件,那么我们应该如何获取它们的 URL 呢?
想象一下,您现在有一个名为 admin 的管理面板,路径是/admin。以及一个典型的UserResource,包含所有页面:
- 索引 index
- 创建 create
- 查看 view
- 编辑 edit
app/Filament/Resources/UserResource.php:
use App\Filament\Resources\UserResource\Pages;
class UserResource extends Resource
{
// ...
public static function getPages(): array
{
return [
'index' => Pages\ListUsers::route('/'),
'create' => Pages\CreateUser::route('/create'),
'view' => Pages\ViewUser::route('/{record}'),
'edit' => Pages\EditUser::route('/{record}/edit'),
];
}
}
如何获得这些页面的链接?或者,如果您有一个添加到资源或不属于任何资源的自定义页面,又该怎么办呢?
本文分享两种在 Filament 应用中获取 URL 的方法:
- 通过 getUrl() 获取 URL
- 通过路由名称(Route Name)获取 URL
通过 getUrl() 方法获取 URL
示例1:在资源中使用 getUrl() 方法获取资源典型页面的链接
第一种方法是使用 Resource 的getUrl()方法,并传入需要生成 URL 的页面名称。
默认情况下,路由名称设置为index。在不带任何参数的情况下调用该方法将返回列表页面的 URL,如https://www.02405.com/demo/users。
为每个页面生成的 URL 将如下所示:
| 方法 | URI |
|---|---|
| UserResource::getUrl(‘index’) | /demo/users |
| UserResource::getUrl(‘create’) | /demo/users/create |
| UserResource::getUrl(‘view’) | /demo/users/{record} |
| UserResource::getUrl(‘edit’) | /demo/users/{record}/edit |
示例2:在资源中使用 getUrl() 方法获取自定义页面的链接
当然,如果你把自定义页面加入到列表中,同样可以通过名称调用它。例如,在 UserResource 中,我添加了一个名为payments的自定义页面。
通过调用UserResource::getUrl('payments'),会生成以下URL:https://www.02405.com/demo/users/payments。
use App\Filament\Resources\UserResource\Pages;
class UserResource extends Resource
{
// ...
public static function getPages(): array
{
return [
'index' => Pages\ListUsers::route('/'),
'create' => Pages\CreateUser::route('/create'),
'payments' => Pages\Payments::route('/payments'),
'view' => Pages\ViewUser::route('/{record}'),
'edit' => Pages\EditUser::route('/{record}/edit'),
];
}
}
示例3:通过 getUrl() 方法获取非资源自定义页面的链接
如果你有一个不属于资源的自定义页面怎么办?你可以在自定义页面上调用相同的getUrl()方法。在自定义页面上调用此方法时,你不需要传递页面名称。
例如,我有一个自定义的付款页面,在面板中的任何地方调用getUrl()方法。
use App\Filament\Pages\Payments;
Payments::getUrl()
它会返回类似这样的 URL:https://www.02405.com/demo/payments。
默认情况下,Filament 将会生成完整的路径 URL。如果你不需要这样,你可以在 getUrl() 方法中将$isAbsolute参数设置为false。
UserResource::getUrl('payments', isAbsolute: false)
这时生成的 URL 将是/admin/users/payments。
通过路由名称(Route Name)获取 URL
另一种获取链接的方法是使用传统的 Laravel route() 辅助函数。虽然没有显式的路由命名文件,但所有 Filament URL 都有路由名称。资源的默认 Filament 路由名称生成方式如下:
filament.{panel_id}.resources.{resource_name}.{page_name}
例如,Admin 面板上 UserResource 列表页面的路由名称为:
filament.admin.resources.users.index
如果是自定义页面的话,那么路由名称为:
filament.{panel_id}.pages.{slug/class_name}
例如,对于 Admin 面板上没有设置 slug 的付款自定义页面,则路由名称为:
filament.admin.pages.payments
您也可以通过使用 Artisan 命令 route:list 获取路由列表来检查和获取更详细路由名称列表。
注意:多租户模式下的参数问题
在使用 Filament 多租户功能时,你可能会遇到错误“Missing parameter: tenant.”。在某些情况下,当生成一个同时包含两个选项的URL时,你必须将tenant作为参数传递。
对于getUrl(),语法应该是:
UserResource::getUrl(tenant: filament()->getTenant());
这样,当前的租户就会作为一个参数传递。
对于使用路由名称和route()助手函数时,语法应该是:
route('filament.admin.resources.users.index', ['tenant' => filament()->getTenant()])




