核心概念
渲染钩子
概述
Filament 允许你在框架视图的多个节点渲染 Blade 模板内容。这使得插件可以注入 HTML 到框架中。同时,由于 Filament 不推荐发布视图因其可能会增加破坏性变更的风险,这也对用户很有用。
注册渲染钩子
要注册渲染钩子,你可以在服务提供者或者中间件中调用 FilamentView::registerRenderHook()
。第一个参数是钩子名称,第二个参数返回要渲染的内容的回调函数:
use Filament\Support\Facades\FilamentView;use Filament\View\PanelsRenderHook;use Illuminate\Support\Facades\Blade; FilamentView::registerRenderHook( PanelsRenderHook::BODY_START, fn (): string => Blade::render('@livewire(\'livewire-ui-modal\')'),);
你也可以在文件中渲染视图内容:
use Filament\Support\Facades\FilamentView;use Filament\View\PanelsRenderHook;use Illuminate\Contracts\View\View; FilamentView::registerRenderHook( PanelsRenderHook::BODY_START, fn (): View => view('impersonation-banner'),);
可用渲染钩子
面板渲染钩子
use Filament\View\PanelsRenderHook;
PanelsRenderHook::AUTH_LOGIN_FORM_AFTER
- 登录表单之后PanelsRenderHook::AUTH_LOGIN_FORM_BEFORE
- 登录表单之前PanelsRenderHook::AUTH_PASSWORD_RESET_REQUEST_FORM_AFTER
- 密码重置请求表单之后PanelsRenderHook::AUTH_PASSWORD_RESET_REQUEST_FORM_BEFORE
- 密码重置请求表单之前PanelsRenderHook::AUTH_PASSWORD_RESET_RESET_FORM_AFTER
- 密码重置表单之后PanelsRenderHook::AUTH_PASSWORD_RESET_RESET_FORM_BEFORE
- 密码重置表单之前PanelsRenderHook::AUTH_REGISTER_FORM_AFTER
- 注册表单之后PanelsRenderHook::AUTH_REGISTER_FORM_BEFORE
- 注册表单之前PanelsRenderHook::BODY_END
-<body>
之后PanelsRenderHook::BODY_START
-</body>
之前PanelsRenderHook::CONTENT_END
-页面内容之后,在<main>
里面PanelsRenderHook::CONTENT_START
- 页面内容之前,在<main>
里PanelsRenderHook::FOOTER
- 页面 footerPanelsRenderHook::GLOBAL_SEARCH_AFTER
- 全局搜索容器之后,在顶部栏内PanelsRenderHook::GLOBAL_SEARCH_BEFORE
- 全局搜索容器之前,在顶部栏内PanelsRenderHook::GLOBAL_SEARCH_END
- 全局搜索 容器尾部PanelsRenderHook::GLOBAL_SEARCH_START
- 全局搜索 容器开始处PanelsRenderHook::HEAD_END
-</head>
之前PanelsRenderHook::HEAD_START
-<head>
之后PanelsRenderHook::PAGE_END
- 页面内容容器结尾,也可将范围锁定到页面或资源类PanelsRenderHook::PAGE_FOOTER_WIDGETS_AFTER
- 在页面 Footer Widget 之后,也可将范围锁定到页面或资源类PanelsRenderHook::PAGE_FOOTER_WIDGETS_BEFORE
- 在页面 Footer Widget 之前,也可将范围锁定到页面或资源类PanelsRenderHook::PAGE_HEADER_ACTIONS_AFTER
- 在页面头部 Action 之后,也可将范围锁定到页面或资源类PanelsRenderHook::PAGE_HEADER_ACTIONS_BEFORE
- 在页面头部 Action 之前,也可将范围锁定到页面或资源类PanelsRenderHook::PAGE_HEADER_WIDGETS_AFTER
- 在页面头部 Widget 之后,也可将范围锁定到页面或资源类PanelsRenderHook::PAGE_HEADER_WIDGETS_BEFORE
- 在页面头部 Widget 之前,也可将范围锁定到页面或资源类PanelsRenderHook::PAGE_START
- 页面内容容器开始处,也可将范围锁定到页面类或资源类PanelsRenderHook::PAGE_SUB_NAVIGATION_END_AFTER
- 在页面子导航结尾(end)侧边栏位置之后,也可将范围锁定到页面或资源类PanelsRenderHook::PAGE_SUB_NAVIGATION_END_BEFORE
- 在页面子导航结尾(end)侧边栏位置之前,也可将范围锁定到页面或资源类PanelsRenderHook::PAGE_SUB_NAVIGATION_SELECT_AFTER
- 在页面子导航结尾(end) Select(移动端)之后,也可将范围锁定到页面或资源类PanelsRenderHook::PAGE_SUB_NAVIGATION_SELECT_BEFORE
- 在页面子导航结尾(end) Select(移动端)之前,也可将范围锁定到页面或资源类PanelsRenderHook::PAGE_SUB_NAVIGATION_START_AFTER
- 在页面子导航开始(start)侧边栏位置之后,也可将范围锁定到页面或资源类PanelsRenderHook::PAGE_SUB_NAVIGATION_START_BEFORE
- 在页面子导航开始(start)侧边栏位置之前,也可将范围锁定到页面或资源类PanelsRenderHook::PAGE_SUB_NAVIGATION_TOP_AFTER
- 在页面子导航顶部(top)选项卡位置之后,也可将范围锁定到页面或资源类PanelsRenderHook::PAGE_SUB_NAVIGATION_TOP_BEFORE
- 在页面子导航顶部(top)选项卡位置之前,也可将范围锁定到页面或资源类PanelsRenderHook::RESOURCE_PAGES_LIST_RECORDS_TABLE_AFTER
- 在资源表格之后,也可将范围锁定到页面类或资源类PanelsRenderHook::RESOURCE_PAGES_LIST_RECORDS_TABLE_BEFORE
- 在资源表格之前,也可将范围锁定到页面类或资源类PanelsRenderHook::RESOURCE_PAGES_LIST_RECORDS_TABS_END
- 过滤器选项卡尾部(最后一个选项卡之后),也可将范围锁定到页面类或资源类PanelsRenderHook::RESOURCE_PAGES_LIST_RECORDS_TABS_START
- 过滤器选项卡开始处(第一个选项卡之前),也可将范围锁定到页面类或资源类PanelsRenderHook::RESOURCE_PAGES_MANAGE_RELATED_RECORDS_TABLE_AFTER
- 在关联管理器表格之后,也可将范围锁定到页面类或资源类PanelsRenderHook::RESOURCE_PAGES_MANAGE_RELATED_RECORDS_TABLE_BEFORE
- 在关联管理器表格之前,也可将范围锁定到页面类或资源类PanelsRenderHook::RESOURCE_RELATION_MANAGER_AFTER
- 在关联管理器表格之后,也可将范围锁定到页面类或关联管理器类PanelsRenderHook::RESOURCE_RELATION_MANAGER_BEFORE
- 在关联管理器表格之前,也可将范围锁定到页面类或关联管理器类PanelsRenderHook::RESOURCE_TABS_END
- 资源选项卡的末尾(最后一个选项卡之后),也可将范围锁定到页面类或资源类PanelsRenderHook::RESOURCE_TABS_START
- 资源选项卡的起始处(第一个选项卡之前),也可将范围锁定到页面或资源类PanelsRenderHook::SCRIPTS_AFTER
- Scripts 脚本定义之后PanelsRenderHook::SCRIPTS_BEFORE
- Scripts 脚本定义之前PanelsRenderHook::SIDEBAR_NAV_END
- 在侧边栏中,</nav>
之前PanelsRenderHook::SIDEBAR_NAV_START
- 在侧边栏中,</nav>
之后PanelsRenderHook::SIMPLE_PAGE_END
- 简单页面的内容容器末尾,也可将范围锁定到页面类PanelsRenderHook::SIMPLE_PAGE_START
- 简单页面的内容容器开头,也可将范围锁定到页面类PanelsRenderHook::SIDEBAR_FOOTER
- 固定在侧边栏的底部,在内容下方PanelsRenderHook::STYLES_AFTER
- 样式定义之后PanelsRenderHook::STYLES_BEFORE
- 样式定义之前PanelsRenderHook::TENANT_MENU_AFTER
- 租户菜单之后PanelsRenderHook::TENANT_MENU_BEFORE
- 租户菜单之前PanelsRenderHook::TOPBAR_AFTER
- Topbar 容器之下PanelsRenderHook::TOPBAR_BEFORE
- Topbar 容器之上PanelsRenderHook::TOPBAR_END
- Topbar 容器末尾PanelsRenderHook::TOPBAR_START
- Topbar 容器起始处PanelsRenderHook::USER_MENU_AFTER
- 用户菜单之后PanelsRenderHook::USER_MENU_BEFORE
- 用户菜单之前PanelsRenderHook::USER_MENU_PROFILE_AFTER
- 用户菜单的 Profile 项之后PanelsRenderHook::USER_MENU_PROFILE_BEFORE
- 用户菜单的 Profile 项之前
表格构造器渲染钩子
所有这些渲染钩子可以将范围锁定到任何的表格 Livewire 组件类中。使用面板构造器使,这些列可以是资源的列表或管理页面,或关联管理器。表格 Widget 也是 Livewire 组件类。
use Filament\Tables\View\TablesRenderHook;
TablesRenderHook::SELECTION_INDICATOR_ACTIONS_AFTER
- 选择指示栏中的“全选”和“取消全选”操作按钮之后TablesRenderHook::SELECTION_INDICATOR_ACTIONS_BEFORE
- 选择指示栏中的“全选”和“取消全选”操作按钮之后TablesRenderHook::HEADER_AFTER
- 在 header 容器之后TablesRenderHook::HEADER_BEFORE
- 在 header 容器之前TablesRenderHook::TOOLBAR_AFTER
- 在 toolbar 容器之后TablesRenderHook::TOOLBAR_BEFORE
- 在 toolbar 容器之前TablesRenderHook::TOOLBAR_END
- 工具栏的末尾TablesRenderHook::TOOLBAR_GROUPING_SELECTOR_AFTER
- 在分组选择器之后TablesRenderHook::TOOLBAR_GROUPING_SELECTOR_BEFORE
- 再分组选择器之前TablesRenderHook::TOOLBAR_REORDER_TRIGGER_AFTER
- 在 reorder 触发器之后TablesRenderHook::TOOLBAR_REORDER_TRIGGER_BEFORE
- 在 reorder 触发器之前TablesRenderHook::TOOLBAR_SEARCH_AFTER
- 搜索容器之后TablesRenderHook::TOOLBAR_SEARCH_BEFORE
- 搜索容器之前TablesRenderHook::TOOLBAR_START
- 工具栏开始处TablesRenderHook::TOOLBAR_TOGGLE_COLUMN_TRIGGER_AFTER
- After the toggle columns triggerTablesRenderHook::TOOLBAR_TOGGLE_COLUMN_TRIGGER_BEFORE
- Before the toggle columns trigger
Widgets 渲染钩子
use Filament\Widgets\View\WidgetsRenderHook;
WidgetsRenderHook::TABLE_WIDGET_END
- 表格 widget的末尾,在表格之后,也可将范围锁定到表格 Widget 类之后WidgetsRenderHook::TABLE_WIDGET_START
- 表格 widget的起始处,在表格之前,也可将范围锁定到表格 Widget 类之后
渲染钩子作用域
有些渲染钩子可以限定作用范围,它让你可以只在某个特定页面或 Livewire 组件中渲染。比如,你可能只想在一个页面中注册钩子。为此,你可以将页面类或组件作为第二个参数传入到 registerRenderHook()
:
use Filament\Support\Facades\FilamentView;use Filament\View\PanelsRenderHook;use Illuminate\Support\Facades\Blade; FilamentView::registerRenderHook( PanelsRenderHook::PAGE_START, fn (): View => view('warning-banner'), scopes: \App\Filament\Resources\UserResource\Pages\EditUser::class,);
你也可以传入 scopes 数组:
use Filament\Support\Facades\FilamentView;use Filament\View\PanelsRenderHook; FilamentView::registerRenderHook( PanelsRenderHook::PAGE_START, fn (): View => view('warning-banner'), scopes: [ \App\Filament\Resources\UserResource\Pages\CreateUser::class, \App\Filament\Resources\UserResource\Pages\EditUser::class, ],);
有些面板构造器的渲染钩子允许你将钩子作用到资源的所有页面:
use Filament\Support\Facades\FilamentView;use Filament\View\PanelsRenderHook; FilamentView::registerRenderHook( PanelsRenderHook::PAGE_START, fn (): View => view('warning-banner'), scopes: \App\Filament\Resources\UserResource::class,);
在渲染钩子中检索当前启用的作用域(scopes)
$scopes
变量被传入到渲染钩子函数中,你可以用它来确定在哪个页面或组件中对钩子进行渲染:
use Filament\Support\Facades\FilamentView;use Filament\View\PanelsRenderHook; FilamentView::registerRenderHook( PanelsRenderHook::PAGE_START, fn (array $scopes): View => view('warning-banner', ['scopes' => $scopes]), scopes: \App\Filament\Resources\UserResource::class,);
渲染钩子
对插件开发者而言,将渲染钩子暴露给插件用户或许有用。你无需在任何地方注册这些钩子,只需在 Blade 中像这样输出:
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::PAGE_START) }}
要限定你的渲染钩子的作用域,你可以将其作为第二个参数传给 renderHook()
。比如,如果钩子在 Livewire 组件内部,你可以使用 static::class
传递该组件类:
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::PAGE_START, scopes: $this->getRenderHookScopes()) }}
你也可以传递多个 scopes 作为数组,所有匹配该 scopes 的渲染钩子都会被渲染:
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::PAGE_START, scopes: [static::class, \App\Filament\Resources\UserResource::class]) }}
Edit on GitHubStill need help? Join our Discord community or open a GitHub discussion