Skip to content
全部文档

概述

简介

产品 infolist 示例产品 infolist 示例

Filament 的 infolists 包可让你为特定实体展示只读数据列表。它已集成到其他 Filament 包中,例如 面板资源关联管理器操作模态框。掌握 infolist 构建器的用法,能在构建自定义 Livewire 应用或使用其他 Filament 功能时节省时间。

本指南介绍使用 Filament 构建信息列表(infolist)的基础知识。若要把 infolist 加到自己的 Livewire 组件中,请先从这里开始再继续。若是把 infolist 加到 面板资源 或其他 Filament 包中,可以直接开始!

定义条目

条目类位于 Filament\Infolists\Components 命名空间中,放在组件的 schema 数组里。Filament 内置多种条目:

你也可以创建自定义条目,按任意方式展示数据。

可使用静态方法 make() 创建条目,并传入其唯一名称。通常,条目名对应 Eloquent 模型上的属性名。你可以使用「点语法(dot notation)」访问关系中的属性:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('title')

TextEntry::make('author.name')
infolist 中的条目infolist 中的条目

条目内容(状态)

条目起初可能显得有些「魔法」,但它们被设计为易于使用,并针对展示 Eloquent 记录中的数据做了优化。尽管如此,它们也很灵活,你可以展示来自任意来源的数据,而不仅限于 Eloquent 记录属性。

条目展示的数据称为其「状态(state)」。使用 面板资源 时,infolist 知道正在展示的记录。因此条目状态会根据记录上该属性的值来设置。例如,若条目用在 PostResource 的 infolist 中,则会展示当前文章的 title 属性值。

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('title')

若要访问存储在关系中的值,可以使用「点语法(dot notation)」。先写要访问数据的关系名,再加一个点,然后是属性名:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('author.name')

你也可以使用「点语法(dot notation)」访问 Eloquent 模型上 JSON / 数组列中的值。先写属性名,再加一个点,然后是要读取的 JSON 对象的键:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('meta.title')

设置条目的状态

你可以使用 state() 方法向条目传入自己的状态:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('title')
    ->state('Hello, world!')

TIP

state() 方法也接受函数以动态计算状态。你可以将各种工具作为参数注入到该函数中。

设置条目的默认状态

当条目为空(状态为 null)时,可使用 default() 方法定义替代状态。该方法会把默认状态当作真实状态处理,因此 图片颜色 等条目会展示默认图片或颜色。

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('title')
    ->default('Untitled')

条目为空时添加占位文本

有时你可能希望为空状态的条目显示占位文本,样式为较浅的灰色文字。这与默认值不同:占位符始终是文本,不会被当作真实状态。

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('title')
    ->placeholder('Untitled')
空状态带占位符的条目空状态带占位符的条目

设置条目标签

默认情况下,显示在 infolist 头部的条目标签会根据条目名称生成。你可以使用 label() 方法自定义:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('name')
    ->label('Full name')

TIP

除了允许静态值外,label() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

以这种方式自定义标签很有用,尤其是当你希望使用 用于本地化的翻译字符串 时:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('name')
    ->label(__('entries.name'))

隐藏条目标签

TIP

若你想隐藏条目标签,可能其实是想用条目来放任意文本或 UI。条目专门用于结构化展示数据,而 Prime 组件 是用于渲染独立静态内容的简单组件,例如文本、图片和按钮(操作)。你可能更适合改用 Prime 组件。

或许会想把标签设为空字符串来隐藏它,但不推荐这样做。即使视觉上用途很明确,空字符串标签也无法向屏幕阅读器传达条目用途。应改用 hiddenLabel() 方法,使其在视觉上隐藏,但对屏幕阅读器仍然可访问:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('name')
    ->hiddenLabel()
隐藏标签的条目隐藏标签的条目

可选地,你可以传入布尔值来控制是否隐藏标签:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('name')
    ->hiddenLabel(FeatureFlag::active())

TIP

除了允许静态值外,hiddenLabel() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

点击条目时打开 URL

点击条目时可以打开 URL。做法是向 url() 方法传入 URL:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('title')
    ->url('/about/titles')

你可以向 url() 方法传入函数以动态计算 URL。例如,可通过注入 $record 参数访问 infolist 当前的 Eloquent 记录:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('title')
    ->url(fn (Post $record): string => route('posts.edit', ['post' => $record]))

若使用 面板资源,可使用 getUrl() 方法生成指向该记录页面的链接:

php
use App\Filament\Posts\PostResource;
use Filament\Infolists\Components\TextEntry;

TextEntry::make('title')
    ->url(fn (Post $record): string => PostResource::getUrl('edit', ['record' => $record]))

TIP

传给 url() 的函数可以将各种工具作为参数注入。

你也可以选择在新标签页中打开 URL:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('title')
    ->url(fn (Post $record): string => PostResource::getUrl('edit', ['record' => $record]))
    ->openUrlInNewTab()

可选地,你可以传入布尔值来控制 URL 是否在新标签页中打开:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('title')
    ->url(fn (Post $record): string => PostResource::getUrl('edit', ['record' => $record]))
    ->openUrlInNewTab(FeatureFlag::active())

TIP

除了允许静态值外,openUrlInNewTab() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

DANGER

若向 url() 方法传入用户可控的数据,应校验该 URL 未使用 javascript:data: 等危险协议。否则可能使应用暴露于 XSS 攻击。最简单的防护方式是用 Filament 的 Str::sanitizeUrl() 辅助函数包裹该值:对未使用 http/https(或相对路径)的 URL,它会返回 null

隐藏条目

你可以隐藏条目:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('role')
    ->hidden()

可选地,你可以传入布尔值来控制是否隐藏条目:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('role')
    ->hidden(! FeatureFlag::active())

TIP

除了允许静态值外,hidden() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

或者,你可以使用 visible() 方法来控制条目是否隐藏。在某些情况下,这可能让代码更易读:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('role')
    ->visible(FeatureFlag::active())

TIP

除了允许静态值外,visible() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

INFO

若同时使用了 hidden()visible(),两者都必须表明条目应可见,条目才会显示。

使用 JavaScript 隐藏条目

若需要根据用户交互隐藏条目,可使用 hidden()visible() 方法,并传入一个利用注入工具来判断是否应隐藏条目的函数:

php
use Filament\Forms\Components\Select;
use Filament\Infolists\Components\IconEntry;

Select::make('role')
    ->options([
        'user' => 'User',
        'staff' => 'Staff',
    ])
    ->live()

IconEntry::make('is_admin')
    ->boolean()
    ->hidden(fn (Get $get): bool => $get('role') !== 'staff')

本例中,role 字段设置了 live(),这意味着每次更改 role 字段时 schema 都会重新加载。这会使传给 hidden() 的函数重新求值;若 role 未设为 staff,则会隐藏 is_admin 条目。

然而,每次条目变化都重新加载 schema 会发起网络请求,因为无法在客户端重新运行 PHP 函数。这对性能并不理想。

或者,你可以编写 JavaScript,根据某字段的值来隐藏条目。做法是向 hiddenJs() 方法传入 JavaScript 表达式:

php
use Filament\Forms\Components\Select;
use Filament\Infolists\Components\IconEntry;

Select::make('role')
    ->options([
        'user' => 'User',
        'staff' => 'Staff',
    ])

IconEntry::make('is_admin')
    ->boolean()
    ->hiddenJs(<<<'JS'
        $get('role') !== 'staff'
        JS)

虽然传给 hiddenJs() 的代码看起来很像 PHP,但它实际是 JavaScript。Filament 为 JavaScript 提供了 $get() 工具函数,行为与 PHP 版本非常相似,但不要求所依赖的条目为 live()

也提供了 visibleJs() 方法,工作方式与 hiddenJs() 相同,但用于控制条目是否可见:

php
use Filament\Forms\Components\Select;
use Filament\Infolists\Components\IconEntry;

Select::make('role')
    ->options([
        'user' => 'User',
        'staff' => 'Staff',
    ])
    
IconEntry::make('is_admin')
    ->boolean()
    ->visibleJs(<<<'JS'
        $get('role') === 'staff'
        JS)

INFO

若同时使用了 hiddenJs()visibleJs(),两者都必须表明条目应可见,条目才会显示。

根据当前操作隐藏条目

schema 的「操作(operation)」是当前对其执行的动作。若使用 面板资源,通常是 createeditview

你可以通过向 hiddenOn() 方法传入操作,根据当前操作隐藏条目:

php
use Filament\Infolists\Components\IconEntry;

IconEntry::make('is_admin')
    ->boolean()
    ->hiddenOn('edit')
    
// is the same as

IconEntry::make('is_admin')
    ->boolean()
    ->hidden(fn (string $operation): bool => $operation === 'edit')

你也可以向 hiddenOn() 方法传入操作数组;若当前操作属于该数组中的任一操作,条目将被隐藏:

php
use Filament\Infolists\Components\IconEntry;

IconEntry::make('is_admin')
    ->boolean()
    ->hiddenOn(['edit', 'view'])
    
// is the same as

IconEntry::make('is_admin')
    ->boolean()
    ->hidden(fn (string $operation): bool => in_array($operation, ['edit', 'view']))

WARNING

hiddenOn() 方法会覆盖此前对 hidden() 方法的任何调用,反之亦然。

或者,你可以使用 visibleOn() 方法来控制条目是否隐藏。在某些情况下,这可能让代码更易读:

php
use Filament\Infolists\Components\IconEntry;

IconEntry::make('is_admin')
    ->boolean()
    ->visibleOn('create')

IconEntry::make('is_admin')
    ->boolean()
    ->visibleOn(['create', 'edit'])

INFO

visibleOn() 方法会覆盖此前对 visible() 方法的任何调用,反之亦然。

行内标签

条目标签可以与条目同行显示,而不是显示在上方。这对条目很多、纵向空间紧张的 infolist 很有用。要让条目标签行内显示,请使用 inlineLabel() 方法:

php
use Filament\Infolists\Components\TextEntry;

TextInput::make('name')
    ->inlineLabel()
带行内标签的 infolist 条目带行内标签的 infolist 条目

可选地,你可以传入布尔值来控制标签是否行内显示:

php
use Filament\Infolists\Components\TextInput;

TextInput::make('name')
    ->inlineLabel(FeatureFlag::active())

TIP

除了允许静态值外,inlineLabel() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

一次在多处使用行内标签

若希望在 布局组件(如 分区(section)标签页(tab))中让所有标签都行内显示,可在该组件本身上使用 inlineLabel(),其内所有条目的标签都会行内显示:

php
use Filament\Infolists\Components\TextInput;
use Filament\Schemas\Components\Section;

Section::make('Details')
    ->inlineLabel()
    ->schema([
        TextInput::make('name'),
        TextInput::make('email')
            ->label('Email address'),
        TextInput::make('phone')
            ->label('Phone number'),
    ])
分区中带行内标签的 infolist 条目分区中带行内标签的 infolist 条目

你也可以在整个 schema 上使用 inlineLabel(),让所有标签都行内显示:

php
use Filament\Schemas\Schema;

public function infolist(Schema $schema): Schema
{
    return $schema
        ->inlineLabel()
        ->components([
            // ...
        ]);
}

在布局组件或 schema 上使用 inlineLabel() 时,仍可通过在单个条目上使用 inlineLabel(false) 退出行内标签:

php
use Filament\Infolists\Components\TextInput;
use Filament\Schemas\Components\Section;

Section::make('Details')
    ->inlineLabel()
    ->schema([
        TextInput::make('name'),
        TextInput::make('email')
            ->label('Email address'),
        TextInput::make('phone')
            ->label('Phone number')
            ->inlineLabel(false),
    ])

为条目添加工具提示

你可以指定悬停在条目上时显示的工具提示:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('title')
    ->tooltip('Shown at the top of the page')

TIP

除了允许静态值外,tooltip() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

带工具提示的条目带工具提示的条目

对齐条目内容

你可以使用 alignStart()alignCenter()alignEnd() 方法将条目内容对齐到起始端(从左到右界面为左,从右到左界面为右)、居中或末端(从左到右界面为右,从右到左界面为左):

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('title')
    ->alignStart() // This is the default alignment.

TextEntry::make('title')
    ->alignCenter()

TextEntry::make('title')
    ->alignEnd()

或者,你可以向 alignment() 方法传入 Alignment 枚举:

php
use Filament\Infolists\Components\TextEntry;
use Filament\Support\Enums\Alignment;

TextEntry::make('title')
    ->alignment(Alignment::Center)

TIP

除了允许静态值外,alignment() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

不同对齐方式的条目不同对齐方式的条目

向条目添加额外内容

条目包含许多「插槽(slots)」,可在子 schema 中插入内容。插槽可接受文本、任意 schema 组件操作(actions)操作组。通常用 prime 组件 来放内容。

所有条目都可用以下插槽:

  • aboveLabel()
  • beforeLabel()
  • afterLabel()
  • belowLabel()
  • aboveContent()
  • beforeContent()
  • afterContent()
  • belowContent()

TIP

除了允许静态值外,插槽方法也接受函数以动态计算。你可以将各种工具作为参数注入到这些函数中。

要插入纯文本,可以向这些方法传入字符串:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('name')
    ->belowContent('This is the user\'s full name.')
内容下方带文本的 infolist 条目内容下方带文本的 infolist 条目

要插入 schema 组件(通常是 prime 组件),可将该组件传给方法:

php
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Text;
use Filament\Support\Enums\FontWeight;

TextEntry::make('name')
    ->belowContent(Text::make('This is the user\'s full name.')->weight(FontWeight::Bold))
内容下方带组件的 infolist 条目内容下方带组件的 infolist 条目

要插入 操作操作组,可将操作或操作组传给方法:

php
use Filament\Actions\Action;
use Filament\Infolists\Components\TextEntry;

TextEntry::make('name')
    ->belowContent(Action::make('generate'))
内容下方带操作的 infolist 条目内容下方带操作的 infolist 条目

你可以通过向方法传入内容数组,将任意内容组合插入插槽:

php
use Filament\Actions\Action;
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Icon;
use Filament\Support\Icons\Heroicon;

TextEntry::make('name')
    ->belowContent([
        Icon::make(Heroicon::InformationCircle),
        'This is the user\'s full name.',
        Action::make('generate'),
    ])
内容下方带多个组件的 infolist 条目内容下方带多个组件的 infolist 条目

你也可以通过将内容数组传给 Schema::start()(默认)、Schema::end()Schema::between() 来对齐插槽中的内容:

php
use Filament\Actions\Action;
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Flex;
use Filament\Schemas\Components\Icon;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;

TextEntry::make('name')
    ->belowContent(Schema::end([
        Icon::make(Heroicon::InformationCircle),
        'This is the user\'s full name.',
        Action::make('generate'),
    ]))

TextEntry::make('name')
    ->belowContent(Schema::between([
        Icon::make(Heroicon::InformationCircle),
        'This is the user\'s full name.',
        Action::make('generate'),
    ]))

TextEntry::make('name')
    ->belowContent(Schema::between([
        Flex::make([
            Icon::make(Heroicon::InformationCircle)
                ->grow(false),
            'This is the user\'s full name.',
        ]),
        Action::make('generate'),
    ]))

TIP

如上例 Schema::between() 所示,使用 Flex 组件 将图标与文本组合在一起,使它们之间没有空隙。图标使用 grow(false) 以避免占据一半横向空间,从而让文本占用剩余空间。

内容下方带对齐组件的 infolist 条目内容下方带对齐组件的 infolist 条目

在条目标签上方添加额外内容

你可以使用 aboveLabel() 方法在条目标签上方插入额外内容。可以向该方法传入任意内容,如文本、schema 组件、操作或操作组:

php
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Icon;
use Filament\Support\Icons\Heroicon;

TextEntry::make('name')
    ->aboveLabel([
        Icon::make(Heroicon::Star),
        'This is the content above the entry\'s label'
    ])

TIP

除了允许静态值外,aboveLabel() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

标签上方带额外内容的 infolist 条目标签上方带额外内容的 infolist 条目

在条目标签之前添加额外内容

你可以使用 beforeLabel() 方法在条目标签之前插入额外内容。可以向该方法传入任意内容,如文本、schema 组件、操作或操作组:

php
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Icon;
use Filament\Support\Icons\Heroicon;

TextEntry::make('name')
    ->beforeLabel(Icon::make(Heroicon::Star))

TIP

除了允许静态值外,beforeLabel() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

标签之前带额外内容的 infolist 条目标签之前带额外内容的 infolist 条目

在条目标签之后添加额外内容

你可以使用 afterLabel() 方法在条目标签之后插入额外内容。可以向该方法传入任意内容,如文本、schema 组件、操作或操作组:

php
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Icon;
use Filament\Support\Icons\Heroicon;

TextEntry::make('name')
    ->afterLabel([
        Icon::make(Heroicon::Star),
        'This is the content after the entry\'s label'
    ])

TIP

除了允许静态值外,afterLabel() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

标签之后带额外内容的 infolist 条目标签之后带额外内容的 infolist 条目

默认情况下,afterLabel() schema 中的内容会对齐到容器末端。若希望对齐到容器起始端,应传入包含内容的 Schema::start() 对象:

php
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Icon;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;

TextEntry::make('name')
    ->afterLabel(Schema::start([
        Icon::make(Heroicon::Star),
        'This is the content after the entry\'s label'
    ]))

TIP

除了允许静态值外,afterLabel() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

标签之后靠起始端对齐额外内容的 infolist 条目标签之后靠起始端对齐额外内容的 infolist 条目

在条目标签下方添加额外内容

你可以使用 belowLabel() 方法在条目标签下方插入额外内容。可以向该方法传入任意内容,如文本、schema 组件、操作或操作组:

php
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Icon;
use Filament\Support\Icons\Heroicon;

TextEntry::make('name')
    ->belowLabel([
        Icon::make(Heroicon::Star),
        'This is the content below the entry\'s label'
    ])

TIP

除了允许静态值外,belowLabel() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

标签下方带额外内容的 infolist 条目标签下方带额外内容的 infolist 条目

INFO

这看起来可能与 aboveContent() 方法 相同。但在使用 行内标签 时,aboveContent() 会把内容放在条目上方,而不是标签下方,因为标签与条目内容分列显示。

在条目内容上方添加额外内容

你可以使用 aboveContent() 方法在条目内容上方插入额外内容。可以向该方法传入任意内容,如文本、schema 组件、操作或操作组:

php
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Icon;
use Filament\Support\Icons\Heroicon;

TextEntry::make('name')
    ->aboveContent([
        Icon::make(Heroicon::Star),
        'This is the content above the entry\'s content'
    ])

TIP

除了允许静态值外,aboveContent() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

内容上方带额外内容的 infolist 条目内容上方带额外内容的 infolist 条目

INFO

这看起来可能与 belowLabel() 方法 相同。但在使用 行内标签 时,belowLabel() 会把内容放在标签下方,而不是条目内容上方,因为标签与条目内容分列显示。

在条目内容之前添加额外内容

你可以使用 beforeContent() 方法在条目内容之前插入额外内容。可以向该方法传入任意内容,如文本、schema 组件、操作或操作组:

php
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Icon;
use Filament\Support\Icons\Heroicon;

TextEntry::make('name')
    ->beforeContent(Icon::make(Heroicon::Star))

TIP

除了允许静态值外,beforeContent() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

内容之前带额外内容的 infolist 条目内容之前带额外内容的 infolist 条目

在条目内容之后添加额外内容

你可以使用 afterContent() 方法在条目内容之后插入额外内容。可以向该方法传入任意内容,如文本、schema 组件、操作或操作组:

php
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Icon;
use Filament\Support\Icons\Heroicon;

TextEntry::make('name')
    ->afterContent(Icon::make(Heroicon::Star))

TIP

除了允许静态值外,afterContent() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

内容之后带额外内容的 infolist 条目内容之后带额外内容的 infolist 条目

向条目添加额外 HTML 属性

你可以通过 extraAttributes() 方法向条目传入额外 HTML 属性,这些属性会合并到其外层 HTML 元素上。属性应以数组表示,键为属性名,值为属性值:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('slug')
    ->extraAttributes(['class' => 'bg-gray-200'])

TIP

除了允许静态值外,extraAttributes() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

默认情况下,多次调用 extraAttributes() 会覆盖先前的属性。若希望改为合并属性,可向方法传入 merge: true

向条目包装器添加额外 HTML 属性

你也可以向包围条目标签与内容的「条目包装器(entry wrapper)」最外层元素传入额外 HTML 属性。若要通过 CSS 样式化标签或条目间距,这很有用,因为你可以把元素作为包装器的子元素来定位:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('slug')
    ->extraEntryWrapperAttributes(['class' => 'components-locked'])

TIP

除了允许静态值外,extraEntryWrapperAttributes() 方法也接受函数以动态计算。你可以将各种工具作为参数注入到该函数中。

默认情况下,多次调用 extraEntryWrapperAttributes() 会覆盖先前的属性。若希望改为合并属性,可向方法传入 merge: true

条目工具注入

绝大多数用于配置条目的方法都接受函数作为参数,而不是硬编码值:

php
use App\Models\User;
use Filament\Infolists\Components\TextEntry;

TextEntry::make('name')
    ->label(fn (string $state): string => str_contains($state, ' ') ? 'Full name' : 'Name')

TextEntry::make('currentUserEmail')
    ->state(fn (): string => auth()->user()->email)

TextEntry::make('role')
    ->hidden(fn (User $record): bool => $record->role === 'admin')

仅此一点就解锁了许多自定义可能。

该包还能以参数形式向这些函数注入许多可用工具。所有接受函数作为参数的自定义方法都可以注入工具。

这些注入的工具要求使用特定的参数名。否则 Filament 不知道要注入什么。

注入条目的当前状态

若要访问条目的当前值(状态),请定义 $state 参数:

php
function ($state) {
    // ...
}

注入另一条目或表单字段的状态

你也可以在回调中使用 $get 参数获取另一条目或表单字段的状态(值):

php
use Filament\Schemas\Components\Utilities\Get;

function (Get $get) {
    $email = $get('email'); // Store the value of the `email` entry in the `$email` variable.
    //...
}

TIP

除非表单字段是响应式的,否则字段值变化时 schema 不会刷新,只会在下一次会向服务器发请求的用户交互时刷新。若需要响应字段值的变化,应将其设为 live()

注入当前 Eloquent 记录

你可以使用 $record 参数获取当前 schema 的 Eloquent 记录:

php
use Illuminate\Database\Eloquent\Model;

function (?Model $record) {
    // ...
}

注入当前操作

若正在为面板资源或关联管理器编写 schema,并希望检查 schema 是 createedit 还是 view,请使用 $operation 参数:

php
function (string $operation) {
    // ...
}

INFO

你可以使用 $schema->operation() 方法手动设置 schema 的操作。

注入当前 Livewire 组件实例

若要访问当前 Livewire 组件实例,请定义 $livewire 参数:

php
use Livewire\Component;

function (Component $livewire) {
    // ...
}

注入当前条目实例

若要访问当前组件实例,请定义 $component 参数:

php
use Filament\Infolists\Components\Entry;

function (Entry $component) {
    // ...
}

注入多个工具

参数通过反射动态注入,因此你可以按任意顺序组合多个参数:

php
use App\Models\User;
use Filament\Schemas\Components\Utilities\Get;
use Livewire\Component as Livewire;

function (Livewire $livewire, Get $get, User $record) {
    // ...
}

从 Laravel 容器注入依赖

你可以像往常一样从 Laravel 容器注入任意内容,并与工具一起使用:

php
use App\Models\User;
use Illuminate\Http\Request;

function (Request $request, User $record) {
    // ...
}

全局设置

若希望全局更改所有条目的默认行为,可在 service provider 的 boot() 方法中调用静态方法 configureUsing(),并传入用于修改条目的 Closure。例如,若希望所有 TextEntry 组件都使用 words(10),可以这样做:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::configureUsing(function (TextEntry $entry): void {
    $entry->words(10);
});

当然,你仍可以在每个条目上单独覆盖此设置:

php
use Filament\Infolists\Components\TextEntry;

TextEntry::make('name')
    ->words(null)