Skip to content
全部文档

Render hooks

简介

Filament 允许你在框架视图的多个位置渲染 Blade 内容。插件可用它向框架注入 HTML。此外,由于 Filament 不建议发布视图(增加破坏性变更风险),对用户也很有用。

注册 render hooks

要注册 render hooks,可从 service provider 或中间件调用 FilamentView::registerRenderHook()。第一个参数是 render hook 名称,第二个是返回待渲染内容的回调:

php
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\')'),
);

也可以从文件渲染视图内容:

php
use Filament\Support\Facades\FilamentView;
use Filament\View\PanelsRenderHook;
use Illuminate\Contracts\View\View;

FilamentView::registerRenderHook(
    PanelsRenderHook::BODY_START,
    fn (): View => view('impersonation-banner'),
);

可用的 render hooks

Panel Builder render hooks

php
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_AFTER - 页面内容之后
  • PanelsRenderHook::CONTENT_BEFORE - 页面内容之前
  • PanelsRenderHook::CONTENT_END - 页面内容之后,位于 <main>
  • PanelsRenderHook::CONTENT_START - 页面内容之前,位于 <main>
  • PanelsRenderHook::FOOTER - 页面页脚
  • PanelsRenderHook::GLOBAL_SEARCH_AFTER - 顶栏内全局搜索容器之后
  • PanelsRenderHook::GLOBAL_SEARCH_BEFORE - 顶栏内全局搜索容器之前
  • PanelsRenderHook::GLOBAL_SEARCH_END - 全局搜索容器末尾
  • PanelsRenderHook::GLOBAL_SEARCH_START - 全局搜索容器开头
  • PanelsRenderHook::HEAD_END - </head> 之前
  • PanelsRenderHook::HEAD_START - <head> 之后
  • PanelsRenderHook::LAYOUT_END - 布局容器末尾,也可限定作用域到页面类
  • PanelsRenderHook::LAYOUT_START - 布局容器开头,也可限定作用域到页面类
  • PanelsRenderHook::PAGE_END - 页面内容容器末尾,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_FOOTER_WIDGETS_AFTER - 页面页脚小部件之后,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_FOOTER_WIDGETS_BEFORE - 页面页脚小部件之前,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_FOOTER_WIDGETS_END - 页面页脚小部件末尾,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_FOOTER_WIDGETS_START - 页面页脚小部件开头,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_HEADER_ACTIONS_AFTER - 页面标题栏 actions 之后,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_HEADER_ACTIONS_BEFORE - 页面标题栏 actions 之前,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_HEADER_HEADING_AFTER - 页面标题之后,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_HEADER_HEADING_BEFORE - 页面标题之前,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_HEADER_WIDGETS_AFTER - 页面标题栏小部件之后,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_HEADER_WIDGETS_BEFORE - 页面标题栏小部件之前,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_HEADER_WIDGETS_END - 页面标题栏小部件末尾,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_HEADER_WIDGETS_START - 页面标题栏小部件开头,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_START - 页面内容容器开头,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_SUB_NAVIGATION_END_AFTER - 页面子导航「end」侧栏位置之后,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_SUB_NAVIGATION_END_BEFORE - 页面子导航「end」侧栏位置之前,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_SUB_NAVIGATION_SELECT_AFTER - 页面子导航 select(移动端)之后,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_SUB_NAVIGATION_SELECT_BEFORE - 页面子导航 select(移动端)之前,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_SUB_NAVIGATION_SIDEBAR_AFTER - 页面子导航侧栏之后,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_SUB_NAVIGATION_SIDEBAR_BEFORE - 页面子导航侧栏之前,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_SUB_NAVIGATION_START_AFTER - 页面子导航「start」侧栏位置之后,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_SUB_NAVIGATION_START_BEFORE - 页面子导航「start」侧栏位置之前,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_SUB_NAVIGATION_TOP_AFTER - 页面子导航「top」标签位置之后,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::PAGE_SUB_NAVIGATION_TOP_BEFORE - 页面子导航「top」标签位置之前,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::RESOURCE_PAGES_LIST_RECORDS_TABLE_AFTER - resource 表格之后,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::RESOURCE_PAGES_LIST_RECORDS_TABLE_BEFORE - resource 表格之前,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::RESOURCE_PAGES_LIST_RECORDS_TABS_END - 筛选标签末尾(最后一个标签之后),也可限定作用域到页面或 resource 类
  • PanelsRenderHook::RESOURCE_PAGES_LIST_RECORDS_TABS_START - 筛选标签开头(第一个标签之前),也可限定作用域到页面或 resource 类
  • PanelsRenderHook::RESOURCE_PAGES_MANAGE_RELATED_RECORDS_TABLE_AFTER - relation manager 表格之后,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::RESOURCE_PAGES_MANAGE_RELATED_RECORDS_TABLE_BEFORE - relation manager 表格之前,也可限定作用域到页面或 resource 类
  • PanelsRenderHook::RESOURCE_RELATION_MANAGER_AFTER - relation manager 表格之后,也可限定作用域到页面或 relation manager 类
  • PanelsRenderHook::RESOURCE_RELATION_MANAGER_BEFORE - relation manager 表格之前,也可限定作用域到页面或 relation manager 类
  • PanelsRenderHook::RESOURCE_TABS_END - resource 标签末尾(最后一个标签之后),也可限定作用域到页面或 resource 类
  • PanelsRenderHook::RESOURCE_TABS_START - resource 标签开头(第一个标签之前),也可限定作用域到页面或 resource 类
  • PanelsRenderHook::SCRIPTS_AFTER - 脚本定义之后
  • PanelsRenderHook::SCRIPTS_BEFORE - 脚本定义之前
  • PanelsRenderHook::SIDEBAR_LOGO_AFTER - 侧栏 logo 之后
  • PanelsRenderHook::SIDEBAR_LOGO_BEFORE - 侧栏 logo 之前
  • PanelsRenderHook::SIDEBAR_NAV_END - 侧栏中,</nav> 之前
  • PanelsRenderHook::SIDEBAR_NAV_START - 侧栏中,<nav> 之后
  • PanelsRenderHook::SIMPLE_LAYOUT_END - 简单布局容器末尾,也可限定作用域到页面类
  • PanelsRenderHook::SIMPLE_LAYOUT_START - 简单布局容器开头,也可限定作用域到页面类
  • PanelsRenderHook::SIMPLE_PAGE_END - 简单页面内容容器末尾,也可限定作用域到页面类
  • PanelsRenderHook::SIMPLE_PAGE_START - 简单页面内容容器开头,也可限定作用域到页面类
  • PanelsRenderHook::SIDEBAR_FOOTER - 固定在侧栏底部、内容下方
  • PanelsRenderHook::SIDEBAR_START - 侧栏容器开头
  • PanelsRenderHook::STYLES_AFTER - 样式定义之后
  • PanelsRenderHook::STYLES_BEFORE - 样式定义之前
  • PanelsRenderHook::TENANT_MENU_AFTER - 租户菜单之后
  • PanelsRenderHook::TENANT_MENU_BEFORE - 租户菜单之前
  • PanelsRenderHook::TOPBAR_AFTER - 顶栏下方
  • PanelsRenderHook::TOPBAR_BEFORE - 顶栏上方
  • PanelsRenderHook::TOPBAR_END - 顶栏容器末尾
  • PanelsRenderHook::TOPBAR_LOGO_AFTER - 顶栏 logo 之后
  • PanelsRenderHook::TOPBAR_LOGO_BEFORE - 顶栏 logo 之前
  • PanelsRenderHook::TOPBAR_START - 顶栏容器开头
  • PanelsRenderHook::USER_MENU_AFTER - 用户菜单之后
  • PanelsRenderHook::USER_MENU_BEFORE - 用户菜单之前
  • PanelsRenderHook::USER_MENU_PROFILE_AFTER - 用户菜单中个人资料项之后
  • PanelsRenderHook::USER_MENU_PROFILE_BEFORE - 用户菜单中个人资料项之前

Table Builder render hooks

这些 render hooks 都可限定作用域到任意表格 Livewire 组件类。使用 Panel Builder 时,这些类可能是 resource 的 List 或 Manage 页面,或 relation manager。表格小部件也是 Livewire 组件类。

php
use Filament\Tables\View\TablesRenderHook;
  • TablesRenderHook::FILTER_INDICATORS - 替换现有筛选指示器,接收 filterIndicators 数据,类型为 array&lt;Filament\Tables\Filters\Indicator&gt;
  • TablesRenderHook::HEADER_CELL - 替换现有表头单元格,在 data 中接收作为 columnFilament\Tables\Columns\Column 对象以及 isReordering
  • TablesRenderHook::SELECTION_INDICATOR_ACTIONS_AFTER - 选择指示条中「全选」与「取消全选」操作按钮之后
  • TablesRenderHook::SELECTION_INDICATOR_ACTIONS_BEFORE - 选择指示条中「全选」与「取消全选」操作按钮之前
  • TablesRenderHook::HEADER_AFTER - 表头容器之后
  • TablesRenderHook::HEADER_BEFORE - 表头容器之前
  • TablesRenderHook::TOOLBAR_AFTER - 工具栏容器之后
  • TablesRenderHook::TOOLBAR_BEFORE - 工具栏容器之前
  • TablesRenderHook::TOOLBAR_END - 工具栏末尾
  • TablesRenderHook::TOOLBAR_GROUPING_SELECTOR_AFTER - 分组选择器之后
  • TablesRenderHook::TOOLBAR_GROUPING_SELECTOR_BEFORE - 分组选择器之前
  • TablesRenderHook::TOOLBAR_REORDER_TRIGGER_AFTER - 重排序触发器之后
  • TablesRenderHook::TOOLBAR_REORDER_TRIGGER_BEFORE - 重排序触发器之前
  • TablesRenderHook::TOOLBAR_SEARCH_AFTER - 搜索容器之后
  • TablesRenderHook::TOOLBAR_SEARCH_BEFORE - 搜索容器之前
  • TablesRenderHook::TOOLBAR_START - 工具栏开头
  • TablesRenderHook::TOOLBAR_COLUMN_MANAGER_TRIGGER_AFTER - 列管理器触发器之后
  • TablesRenderHook::TOOLBAR_COLUMN_MANAGER_TRIGGER_BEFORE - 列管理器触发器之前

Actions render hooks

这些 render hooks 都可限定作用域到任意 Livewire 组件类。使用 Panel Builder 时,这些类可能是 resource 的 List 或 Manage 页面,或 relation manager。

这种情况下仅限定作用域通常不够,因为 Livewire 组件可有多个 actions,因此可在所有这些 render hooks 中将 action 数据作为 Filament\Actions\Action 访问,以识别具体 action。

php
use Filament\Actions\View\ActionsRenderHook;

Widgets render hooks

php
use Filament\Widgets\View\WidgetsRenderHook;

限定 render hooks 作用域

部分 render hooks 可给定「scope」,使其仅在特定页面或 Livewire 组件上输出。例如,你可能只想为 1 个页面注册 render hook。为此,可将页面或组件的类作为第二个参数传给 registerRenderHook()

php
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\Users\Pages\EditUser::class,
);

也可传入作用域数组以注册 render hook:

php
use Filament\Support\Facades\FilamentView;
use Filament\View\PanelsRenderHook;

FilamentView::registerRenderHook(
    PanelsRenderHook::PAGE_START,
    fn (): View => view('warning-banner'),
    scopes: [
        \App\Filament\Resources\Users\Pages\CreateUser::class,
        \App\Filament\Resources\Users\Pages\EditUser::class,
    ],
);

部分 Panel Builder 的 render hooks 可将 hook 限定到某个 resource 的所有页面:

php
use Filament\Support\Facades\FilamentView;
use Filament\View\PanelsRenderHook;

FilamentView::registerRenderHook(
    PanelsRenderHook::PAGE_START,
    fn (): View => view('warning-banner'),
    scopes: \App\Filament\Resources\Users\UserResource::class,
);

在 render hook 内获取当前活动作用域

$scopes 会传给 render hook 函数,可用它判断当前渲染在哪个页面或组件上:

php
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\Users\UserResource::class,
);

向 render hooks 传递数据

Render hooks 可在渲染时接收「data」。要访问数据,可在 hook 的渲染函数中注入 array $data 参数:

php
use Filament\Support\Facades\FilamentView;
use Filament\Tables\View\TablesRenderHook;

FilamentView::registerRenderHook(
    TablesRenderHook::FILTER_INDICATORS,
    fn (array $data): View => view('filter-indicators', ['indicators' => $data['filterIndicators']]),
);

渲染 hooks

插件开发者可能希望向用户暴露 render hooks。无需在任何地方注册,直接在 Blade 中输出即可:

blade
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::PAGE_START) }}

要为 render hook 提供作用域,可将其作为第二个参数传给 renderHook()。例如,若 hook 在 Livewire 组件内,可用 static::class 传入组件类:

blade
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::PAGE_START, scopes: $this->getRenderHookScopes()) }}

甚至可以数组传入多个作用域,匹配任一作用域的所有 render hooks 都会被渲染:

blade
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::PAGE_START, scopes: [static::class, \App\Filament\Resources\Users\UserResource::class]) }}

可通过 renderHook()data 参数向 render hook 传递数据

blade
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\Tables\View\TablesRenderHook::FILTER_INDICATORS, data: ['filterIndicators' => $filterIndicators]) }}