Filament 允许你为应用创建完全自定义页面。
要创建一个新页面,您可以使用:
php artisan make:filament-page Settings此命令将创建两个文件 - 一个页面类在 Filament 目录的 /Pages 目录中,以及一个视图在 Filament 视图目录的 /pages 目录中。
页面类都是全页 Livewire 组件,带有一些你可以在面板中使用的额外实用工具。
您可以通过覆盖您的 Page 类中的 canAccess() 方法来阻止页面出现在菜单中。这很有用,如果您想控制哪些用户可以在导航中看到该页面,以及哪些用户可以直接访问该页面:
public static function canAccess(): bool
{
return auth()->user()->canManageSettings();
}动作是可以在页面上执行任务或访问 URL 的按钮。您可以此处阅读更多关于它们的功能。
由于所有页面都是 Livewire 组件,您可以添加操作到任何位置。页面已经为您设置了InteractsWithActions trait、HasActions 接口,以及<x-filament-actions::modals /> Blade 组件。
您还可以轻松地向任何页面的头部添加操作,包括资源页面。您无需担心向 Blade 模板添加任何内容,我们已为您处理妥当。只需从页面类的 getHeaderActions() 方法中返回您的操作即可:
use Filament\Actions\Action;
protected function getHeaderActions(): array
{
return [
Action::make('edit')
->url(route('posts.edit', ['post' => $this->post])),
Action::make('delete')
->requiresConfirmation()
->action(fn () => $this->post->delete()),
];
}默认情况下,页眉操作在移动端靠左对齐。要在移动端更改页眉操作的对齐方式,设置 $headerActionsAlignment:
use Filament\Support\Enums\Alignment;
protected ?Alignment $headerActionsAlignment = Alignment::End;您还可以通过将 $defaultAction 属性设置为要打开的操作的名称,在页面加载时打开一个操作:
use Filament\Actions\Action;
public $defaultAction = 'onboarding';
public function onboardingAction(): Action
{
return Action::make('onboarding')
->modalHeading('Welcome')
->visible(fn (): bool => ! auth()->user()->isOnBoarded());
}你还可以使用 $defaultActionArguments 属性,向默认操作传递一个参数数组:
public $defaultActionArguments = ['step' => 2];或者,你可以在页面加载时,通过将 action 指定为页面的查询字符串参数来打开一个操作模态框:
/admin/products/edit/932510?action=onboarding
如果你正在编辑或查看资源页面上使用操作,你可以使用refreshFormData() 方法刷新主表单中的数据:
use App\Models\Post;
use Filament\Actions\Action;
Action::make('approve')
->action(function (Post $record) {
$record->approve();
$this->refreshFormData([
'status',
]);
})该方法接收一个您希望在表单中刷新的模型属性数组。
Filament 允许你在页面内显示 小部件,在页眉下方和页脚上方。
若要向页面添加小部件,请使用 getHeaderWidgets() 或 getFooterWidgets() 方法:
use App\Filament\Widgets\StatsOverviewWidget;
protected function getHeaderWidgets(): array
{
return [
StatsOverviewWidget::class
];
}getHeaderWidgets() 返回一个部件数组,用于显示在页面内容上方, 而 getFooterWidgets() 则显示在下方。
如果您想学习如何构建和自定义小部件,请查看小部件文档部分。
您可以更改用于显示小部件的网格列数量。
您可以覆盖 getHeaderWidgetsColumns() 或 getFooterWidgetsColumns() 方法以返回要使用的网格列数:
public function getHeaderWidgetsColumns(): int | array
{
return 3;
}您可能希望根据浏览器的响应式断点更改小部件网格的列数。您可以通过使用一个数组来实现,该数组包含在每个断点处应使用的列数:
public function getHeaderWidgetsColumns(): int | array
{
return [
'md' => 4,
'xl' => 5,
];
}这与响应式组件宽度搭配得很好。
您可以使用getWidgetData()方法从页面向小部件传递数据:
public function getWidgetData(): array
{
return [
'stats' => [
'total' => 100,
],
];
}现在,你可以在 widget 类上定义一个对应的公共 $stats 数组属性,它将自动填充:
public $stats = [];当在页面上注册小部件时,你可以使用 make() 方法向其传递一个 Livewire 属性 数组:
use App\Filament\Widgets\StatsOverviewWidget;
protected function getHeaderWidgets(): array
{
return [
StatsOverviewWidget::make([
'status' => 'active',
]),
];
}此属性数组被映射到公共 Livewire 属性在部件类上:
use Filament\Widgets\Widget;
class StatsOverviewWidget extends Widget
{
public string $status;
// ...
}现在,你可以在 widget 类中,使用 $this->status 访问 status。
默认情况下,Filament 将根据其名称自动为您的页面生成一个标题。您可以通过在页面类上定义一个 $title 属性来覆盖此设置:
protected static ?string $title = 'Custom Page Title';或者,你可以从 getTitle() 方法中返回一个字符串:
use Illuminate\Contracts\Support\Htmlable;
public function getTitle(): string | Htmlable
{
return __('Custom Page Title');
}默认情况下,Filament 将使用页面的 标题 作为其 导航 项标签。您可以通过在页面类上定义一个 $navigationLabel 属性来覆盖此行为:
protected static ?string $navigationLabel = 'Custom Navigation Label';或者,您可以在 getNavigationLabel() 方法中返回一个字符串:
public static function getNavigationLabel(): string
{
return __('Custom Navigation Label');
}默认情况下,Filament 将根据页面名称自动生成一个 URL (slug)。你可以通过在你的页面类上定义一个 $slug 属性来覆盖此行为:
protected static ?string $slug = 'custom-url-slug';默认情况下,Filament 会使用页面的 标题 作为其页面标题。你可以通过在你的页面类上定义一个 $heading 属性来覆盖它:
protected ?string $heading = 'Custom Page Heading';或者,你可以从 getHeading() 方法返回一个字符串:
public function getHeading(): string
{
return __('Custom Page Heading');
}您还可以通过在您的页面类上定义一个 $subheading 属性来为您的页面添加一个副标题:
protected ?string $subheading = 'Custom Page Subheading';或者,你可以从 getSubheading() 方法中返回一个字符串:
public function getSubheading(): ?string
{
return __('Custom Page Subheading');
}您可以替换默认的标题、副标题和操作为任何页面使用自定义的头部视图。您可以从getHeader()方法中返回它:
use Illuminate\Contracts\View\View;
public function getHeader(): ?View
{
return view('filament.settings.custom-header');
}本示例假设您有一个 Blade 视图,位于 resources/views/filament/settings/custom-header.blade.php.
您也可以为任何页面添加页脚,位于其内容下方。您可以从 getFooter() 方法返回它:
use Illuminate\Contracts\View\View;
public function getFooter(): ?View
{
return view('filament.settings.custom-footer');
}本例假设您有一个 Blade 视图位于 resources/views/filament/settings/custom-footer.blade.php。
默认情况下,Filament 将限制页面内容的宽度,以免在大屏幕上内容过宽。要更改此设置,您可以覆盖 getMaxContentWidth() 方法。选项对应于 Tailwind 的最大宽度比例。可选选项包括 ExtraSmall、Small、Medium、Large、ExtraLarge、TwoExtraLarge、ThreeExtraLarge、FourExtraLarge、FiveExtraLarge、SixExtraLarge、SevenExtraLarge、Full、MinContent、MaxContent、FitContent、 Prose、ScreenSmall、ScreenMedium、ScreenLarge、ScreenExtraLarge 和 ScreenTwoExtraLarge。默认值为 SevenExtraLarge:
use Filament\Support\Enums\Width;
public function getMaxContentWidth(): Width
{
return Width::Full;
}Filament 提供 getUrl() 静态方法在页面类上,用于为其生成 URL。传统上,你需要手动构建 URL 或使用 Laravel 的 route() 辅助函数,但这些方法依赖于页面 slug 或路由命名约定的知识。
该 getUrl() 方法,不带任何参数,将生成一个 URL:
use App\Filament\Pages\Settings;
Settings::getUrl(); // /admin/settings如果你的页面使用 URL / 查询参数,你应该使用参数:
use App\Filament\Pages\Settings;
Settings::getUrl(['section' => 'notifications']); // /admin/settings?section=notifications如果你的应用中有多个面板,getUrl() 将生成当前面板内的 URL。你还可以通过将面板 ID 传递给 panel 参数来指示页面关联的面板:
use App\Filament\Pages\Settings;
Settings::getUrl(panel: 'marketing');您可能希望向多个页面添加一个通用的子导航,以允许用户在它们之间快速导航。您可以通过定义一个集群来做到这一点。集群还可以包含资源,并且您可以在集群内切换多个页面或资源。
子导航默认在页面开头渲染。您可以通过在页面上设置 $subNavigationPosition 属性来更改页面的位置。该值可以是 SubNavigationPosition::Start、SubNavigationPosition::End 或 SubNavigationPosition::Top,以将子导航渲染为选项卡:
use Filament\Pages\Enums\SubNavigationPosition;
protected static ?SubNavigationPosition $subNavigationPosition = SubNavigationPosition::End;body 标签添加额外属性你可能希望为页面的 <body> 标签添加额外属性。为此,你可以在 $extraBodyAttributes 中设置一个属性数组:
protected array $extraBodyAttributes = [];或者,您可以从 getExtraBodyAttributes() 方法中返回一个属性及其值的数组:
public function getExtraBodyAttributes(): array
{
return [
'class' => 'settings-page',
];
}