logo

字段

定义字段

每个 Nova 资源均包含一个 fields 方法。此方法返回一个字段数组,每个字段通常继承了 Laravel\Nova\Fields\Field 类。Nova 提供了各种开箱即用的字段,包括文本输入、布尔、日期、文件上传、 Markdown 等多种字段。

要向资源添加字段,我们只需将它加入到资源的 fields 方法内。通常,可以使用字段的静态 make 方法创建字段。此方法会接受几个参数;但是,通常只需传递一个「易于阅读的」字段名称。Nova 对此名称应用「蛇形命名法(下划线命名法)」以确定对应的底层数据库列:

php
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;

/**
 * 获取资源显示的字段。
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function fields(NovaRequest $request)
{
    return [
        ID::make()->sortable(),
        Text::make('Name')->sortable(),
    ];
}

字段列名约定

如上所述,Nova 对字段的展示名称应用「蛇形命名法(下划线命名法)」 ,以确定底层的数据库列。但如果需要,你可以将列名作为第二个参数传递给字段的 make 方法:

php
Text::make('Name', 'name_column'),

如果字段分配了JSON、ArrayObject 或数组强制转换,则可以使用 -> 运算符在字段中指定嵌套属性:

php
Timezone::make('User Timezone', 'settings->timezone'),

显示 / 隐藏 字段

你经常会在某些场景下只想显示某个字段。例如,你通常有一个在查询列表中无需显示的 Password 字段。同样地,你也想在「创建 / 更新表单」里只显示 Created At 字段。Nova 可以轻松实现在页面上 显示 / 隐藏 字段。

下面的方法可在显示的上下文里 显示 / 隐藏 字段:

  • showOnIndex
  • showOnDetail
  • showOnCreating
  • showOnUpdating
  • showOnPreview
  • showWhenPeeking
  • hideFromIndex
  • hideFromDetail
  • hideWhenCreating
  • hideWhenUpdating
  • onlyOnIndex
  • onlyOnDetail
  • onlyOnForms
  • exceptOnForms

你可以在字段定义时链式调用这些方法,以指示 Nova 在哪里可以 显示 / 隐藏 字段:

php
Text::make('Name')->hideFromIndex(),

或者,你可以将回调传递给以下方法。

  • showOnIndex
  • showOnDetail
  • showOnCreating
  • showOnUpdating
  • showWhenPeeking
  • hideFromIndex
  • hideFromDetail
  • hideWhenCreating
  • hideWhenUpdating
  • showOnPreview
  • onlyOnPreview

对于 show* 方法,如果给定的回调返回 true,则会显示该字段:

php
Text::make('Name')->showOnIndex(function (NovaRequest $request, $resource) {
    return $this->name === 'Taylor Otwell';
}),

对于 hide* 方法,如果给定的回调返回 true,则该字段将被隐藏:

php
Text::make('Name')->hideFromIndex(function (NovaRequest $request, $resource) {
    return $this->name === 'Taylor Otwell';
}),

查看时显示字段

通过在定义字段时调用 showWhenPeeking 方法,可以允许字段 在查看资源时 可见:

php
Text::make('Name')->showWhenPeeking(),

资源预览模式

你还可以定义哪些字段应该包含在资源的「预览」模式中。用户在查看资源索引时,可以为给定资源显示此模式:

php
Text::make('Title')->showOnPreview(),

Markdown::make('Content')->showOnPreview(),

或者,你可以将回调传递给 showOnPreview 方法:

php
Markdown::make('Content')->showOnPreview(function (NovaRequest $request, $resource) {
    return $request->user()->can('previewContent');
}),

Resource Preview

动态字段方法

如果应用程序需要,可以为特定的显示上下文指定单独的字段列表。例如,假设你有一个具有以下字段列表的资源:

php
/**
 * 获取资源显示的字段。
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function fields(NovaRequest $request)
{
    return [
        Text::make('First Name'),
        Text::make('Last Name'),
        Text::make('Job Title'),
    ];
}

在你的详细信息页面上,你可能希望通过计算字段显示一个组合名称和职务。为了做到这一点,你可以向资源类添加一个 fieldsForDetail 方法,该方法返回一个单独的字段列表,该列表只应显示在资源的详细信息页面上:

php
/**
 * 获取资源在详细信息页面上显示的字段。
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function fieldsForDetail(NovaRequest $request)
{
    return [
        Text::make('Name', function () {
            return sprintf('%s %s', $this->first_name, $this->last_name);
        }),

        Text::make('Job Title'),
    ];
}

下面的方法可以为各个显示上下文定义:

  • fieldsForIndex
  • fieldsForDetail
  • fieldsForInlineCreate
  • fieldsForCreate
  • fieldsForUpdate
  • fieldsForPreview

动态字段方法优先级 ::

fieldsForIndex, fieldsForDetail, fieldsForInlineCreate, fieldsForCreate,fieldsForUpdate, 和 fieldsForPreview 方法优先级始终大于 fields 方法。

默认值

有时你可能希望为字段提供默认值。Nova 通过 default 方法提供此功能,该方法接受值或回调。此值将用作资源创建视图中字段的默认输入值:

php
BelongsTo::make('Name')->default($request->user()->getKey()),

Text::make('Uuid')->default(function ($request) {
    return Str::orderedUuid();
}),

字段占位符提示文本

默认情况下,字段的占位符提示文本将是其名称。你可以使用 placeholder 方法覆盖支持占位符的字段的占位符提示文本:

php
Text::make('Name')->placeholder('My New Post'),

字段填充

在 Nova 收到的每个针对给定资源的创建或更新请求中,在模型持久化到数据库之前,每个字段的相应模型属性都将自动填充。如有必要,你可以使用 fillUsing 方法自定义给定字段:

php
Text::make('Name', 'name')
    ->fillUsing(function ($request, $model, $attribute, $requestAttribute) {
        $model->{$attribute} = Str::title($request->input($attribute));
    }),

字段面板

如果你的资源包含很多字段,屏幕上资源的「详情页」会很拥挤。鉴于此,你可以选择把字段组拆分到它们自己的「面板」里:

Field Panel Example

你也可以通过在资源的 fields 方法里创建一个 Panel 实例实现此目的。每个 Panel 实例需要一个名称和一个属于它的字段数组:

php
use Laravel\Nova\Panel;

/**
 * 获取资源要展示的字段。
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function fields(NovaRequest $request)
{
    return [
        ID::make()->sortable(),

        Panel::make('Address Information', $this->addressFields()),
    ];
}

/**
 * 获取资源的所有地址字段。
 *
 * @return array
 */
protected function addressFields()
{
    return [
        Text::make('Address', 'address_line_1')->hideFromIndex(),
        Text::make('Address Line 2')->hideFromIndex(),
        Text::make('City')->hideFromIndex(),
        Text::make('State')->hideFromIndex(),
        Text::make('Postal Code')->hideFromIndex(),
        Country::make('Country')->hideFromIndex(),
    ];
}

你可以使用 limit 方法限制面板中显示的字段数量:

php
Panel::make('Profile', [
    Text::make('Full Name'),
    Date::make('Date of Birth'),
    Text::make('Place of Birth'),
])->limit(1),

具有已定义字段限制的面板将显示显示所有字段按钮,以便用户在需要时查看所有已定义字段。

可排序字段

当向资源添加一个字段时,你可以使用 sortable 方法指示资源列表可以按照给定的字段排序:

php
Text::make('Name', 'name_column')->sortable(),

字段类型

关联字段

这部分文档只讨论非关联字段。了解关联字段的更多信息, 点击查看文档

Nova 提供了丰富的字段类型。那么,让我们浏览一下所有的类型和相应选项:

Audio 音频字段

Audio 字段继承了 File 字段,接受相同配置选项。与 File 字段不同,Audio 字段将在查看资源时显示基础图像的缩略图预览:

Audio Field

php
use Laravel\Nova\Fields\Audio;

Audio::make('Theme Song'),

默认情况下,Audio 字段允许用户下载链接的文件。要禁用下载,可以在字段定义中使用 disableDownload 方法:

php
Audio::make('Theme Song')->disableDownload(),

你可以使用 preload 方法设置字段的preload 字段

php
Audio::make('Theme Song')->preload('auto'),

Audio::make('Theme Song')->preload(Audio::PRELOAD_METADATA),

File 字段

要了解有关定义文件字段和处理上传的更多信息,请查看完整文档 file 字段

Avatar 头像字段

Avatar 字段继承了 Image 字段 ,接受相同配置选项:

php
use Laravel\Nova\Fields\Avatar;

Avatar::make('Avatar'),

如果一个资源包含 Avatar 字段,此字段会展示在搜索结果的资源标题旁边:

Avatar Search Results

你可以使用 squared 方法来显示带有方形边缘的图像缩略图。此外,你可以使用 rounded 方法显示具有完全圆角边缘的缩略图:

php
Avatar::make('Avatar')->squared(),

Badge 徽章字段

Badge 字段可用于在索引和详细信息视图中显示 Resource 的状态:

php
use Laravel\Nova\Fields\Badge;

Badge::make('Status', function () {
    return User::statuses[$this->status];
}),

默认情况下,Badge 字段支持四种显示方式:info, success, danger, and warning。你可以使用 map 方法自定义需要的字段值及其关联的徽章类型:

php
Badge::make('Status')->map([
    'draft' => 'danger',
    'published' => 'success',
]),

或者,你可以使用 types 方法来完全替换内置的 Badge 类型及其关联的 CSS 类。CSS 类可以作为字符串或数组提供:

php
Badge::make('Status')->types([
    'draft' => 'font-medium text-gray-600',
    'published' => ['font-bold', 'text-green-600'],
]),

如果你只想补充内置 Badge 类型,而不是覆盖所有徽章类型,则可以使用 addTypes 方法:

php
Badge::make('Status')->addTypes([
    'draft' => 'custom classes',
]),

编辑 Badge 类型

默认情况下,Badge 字段不会显示在资源的编辑或更新页面上。如果你希望修改编辑表单上 Badge 字段表示的基本值,请结合 onlyOnForms 字段选项定义另一个字段。

如果你想显示带有相关图标的 Badge,可以使用 withIcons 方法指示 Nova 显示图标:

php
Badge::make('Status')->map([
    'draft' => 'danger',
    'published' => 'success',
])->withIcons(),

如果你想自定义显示 Badge 字段时使用的图标,可以使用 icons 方法:

php
Badge::make('Status')->map([
    'draft' => 'danger',
    'published' => 'success',
])->icons([
    'danger' => 'exclamation-circle',
    'success' => 'check-circle',
]),

如果你想自定义显示的标签,可以使用 label 方法:

php
Badge::make('Status')->map([
    'draft' => 'danger',
    'published' => 'success',
])->label(function ($value) {
    return __($value);
}),

你可以使用 labels 方法提供自定义标签列表:

php
Badge::make('Status')->map([
    'draft' => 'danger',
    'published' => 'success',
])->labels([
    'draft' => 'Draft',
    'published' => 'Published',
]),

Boolean 字段

Boolean 字段可以用来表示布尔或「短整数」型的数据库列。例如,假设你的数据库有一个叫做 active 的布尔型列,你就可以给资源添加一个 Boolean 字段,就像这样:

php
use Laravel\Nova\Fields\Boolean;

Boolean::make('Active'),

自定义 True / False 值

如果使用 true, false, 1, 或 0 以外的值来表示「true」或「false」,可以指示 Nova 使用应用程序可识别的自定义值。为此,请在定义 Boolean 字段时链式调用 trueValuefalseValue 方法:

php
Boolean::make('Active')
    ->trueValue('On')
    ->falseValue('Off'),

BooleanGroup 布尔组字段

BooleanGroup 字段可用于对一组布尔复选框进行分组,然后将其作为 JSON 键值存储在所代表的数据库列中。你可以通过为每个选项提供一组键和标签来创建 BooleanGroup 字段:

php
use Laravel\Nova\Fields\BooleanGroup;

BooleanGroup::make('Permissions')->options([
    'create' => 'Create',
    'read' => 'Read',
    'update' => 'Update',
    'delete' => 'Delete',
]),

用户将看到一组分组的复选框,保存后将转换为JSON格式:

json
{
  "create": true,
  "read": false,
  "update": false,
  "delete": false
}

在使用此字段类型之前,应确保将基础 Eloquent 属性配置为强制转换为 Eloquent 模型类中的 array (或等效项):

php
protected $casts = [
    'permissions' => 'array'
];

有时,你可能希望从显示中排除 truefalse 的值,以避免混淆字段的表示。你可以通过调用字段定义上的 hideFalseValueshideTrueValues 方法来实现这一点:

php
BooleanGroup::make('Permissions')->options([
    'create' => 'Create',
    'read' => 'Read',
    'update' => 'Update',
    'delete' => 'Delete',
])->hideFalseValues(),

BooleanGroup::make('Permissions')->options([
    'create' => 'Create',
    'read' => 'Read',
    'update' => 'Update',
    'delete' => 'Delete',
])->hideTrueValues(),

如果基础字段为空,Nova将显示「无数据」。你可以使用 noValueText 方法自定义此文本:

php
BooleanGroup::make('Permissions')->options([
    'create' => 'Create',
    'read' => 'Read',
    'update' => 'Update',
    'delete' => 'Delete',
])->noValueText('No permissions selected.'),

Code 代码编辑器字段

Code 字段为 Nova 后台管理面板提供了一个漂亮的代码编辑器。通常,Code 字段应该添加在 TEXT 型的数据库列上。

php
use Laravel\Nova\Fields\Code;

Code::make('Snippet'),

你还可以将 Code 字段附加到 JSON 数据库列中。默认情况下,该字段将以 JSON 字符串的形式显示该值。你可以根据应用程序的需要将基础 Eloquent 属性强制转换为arraycollectionobject, 或 json

php
use Laravel\Nova\Fields\Code;

Code::make('Options')->json(),

列表上的代码字段

默认,Nova 在资源列表里不显示 Code 字段。

编辑 JSON

如果打算对一个 Code 字段实例仅编辑 JSON,可以在字段定义时链式调用 json 方法:

php
Code::make('Options')->json(),

代码字段 JSON 验证

Nova 不会自动将 json 验证规则应用于 Code 字段。如果希望应用此规则,则必须在验证期间手动指定此规则。

语法高亮

你可以使用 language 方法自定义 Code 字段相应语言的语法高亮:

php
Code::make('Snippet')->language('php'),

Code 字段当前支持高亮的语言是:

  • dockerfile
  • htmlmixed
  • javascript
  • markdown
  • nginx
  • php
  • ruby
  • sass
  • shell
  • sql
  • twig
  • vim
  • vue
  • xml
  • yaml-frontmatter
  • yaml

Color 颜色字段

Color 字段使用 HTML5 color 输入元素生成颜色选择器:

php
use Laravel\Nova\Fields\Color;

Color::make('Color', 'label_color'),

Country 国家字段

Country 字段会生成一个包含了所有国家列表的 Select 字段。该字段将存储国家/地区对应的两个字母的代码:

php
use Laravel\Nova\Fields\Country;

Country::make('Country', 'country_code'),

Currency 货币字段

Currency 字段生成一个 Number 字段,该字段使用 brick/money PHP 包自动格式化。Nova 将使用 USD 作为默认货币;但是,这可以通过修改 nova.currency 配置值来更改:

php
use Laravel\Nova\Fields\Currency;

Currency::make('Price'),

你可以使用 currency 方法来覆盖默认货币:

php
Currency::make('Price')->currency('EUR'),

先决条件

PHP 扩展 ext-intl 是显示格式化货币所必需的。或者,你可以安装 symfony/polyfill-intl-icu Composer包,该包提供对「en」语言环境的支持。

你可以使用 minmaxstep 方法在生成的 input 控件上设置相应的属性:

php
Currency::make('price')->min(1)->max(1000)->step(0.01),

货币步长限制

如果你计划使用 step 方法自定义货币「step」金额,则应确保始终在 currencyasMinorUnitsasMajorUnits 方法之后调用 step。在 step 方法之后调用这些方法将覆盖 step 方法的行为。

字段的区域设置来自应用程序的 app.locale 配置值中的值。你可以通过向 locale 方法提供区域设置代码来覆盖此行为:

php
Currency::make('Price')->locale('fr'),

Date 日期字段

Date 字段存储日期值(不包括时间)。要了解更多信息, 请查看 日期时间字段

php
use Laravel\Nova\Fields\Date;

Date::make('Birthday'),

DateTime 日期时间字段

DateTime 字段可以用来存储日期时间值。要了解更多信息, 请查看 日期时间字段

php
use Laravel\Nova\Fields\DateTime;

DateTime::make('Updated At')->hideFromIndex(),

Email 邮箱字段

Email 字段可用于在列表视图和详细信息视图上显示带有 mailto: 链接的列:

php
use Laravel\Nova\Fields\Email;

Email::make(),

Email::make('Customer Email', 'customer_email'),

File 文件字段

要了解有关定义文件字段和处理上传的更多信息,要了解更多信息, 请查看 文件字段.

php
use Laravel\Nova\Fields\File;

File::make('Attachment'),

Gravatar 字段

Gravatar 字段不对应于应用程序数据库的任何一种列类型。相反,它可以显示与模型关联的「Gravatar」头像。

默认地,Gravatar URL 基于模型的 email 列生成。但是,如果用户的邮箱地址不存储在 email 列,你可以给字段的 make 方法传递一个自定义列名:

php
use Laravel\Nova\Fields\Gravatar;

// 使用「email」列...
Gravatar::make(),

// 用「email_address」列...
Gravatar::make('Avatar', 'email_address'),

你可以使用 squared 方法来显示带有方形边缘的图像缩略图。此外,你可以使用 rounded 方法来显示具有完全圆角边缘的图像:

php
Gravatar::make('Avatar', 'email_address')->squared(),

Heading 标题字段

Heading 字段与应用程序数据库中的任何列都不对应。它用于在表单中显示横幅,并可作为字段长列表的分隔符:

Heading Field

php
use Laravel\Nova\Fields\Heading;

Heading::make('Meta'),

如果需要在 Heading 字段中呈现 HTML 内容,则可以在定义字段时调用 asHtml 方法:

php
Heading::make('<p class="text-danger">* All fields are required.</p>')->asHtml(),

标题和列表页

Heading 字段将自动在列表页中隐藏。

Hidden 隐藏字段

Hidden 字段可用于传递用户不需要更改但保存资源所需的任何值:

php
Hidden::make('Slug'),

Hidden::make('Slug')->default(Str::random(64)),

默认值 相结合,Hidden 字段可用于将相关 ID 等信息传递到表单:

php
Hidden::make('User', 'user_id')->default(function ($request) {
    return $request->user()->id;
}),

ID 字段

ID 表示资源的数据库表主键。通常你定义的每个 Nova 资源都应该包含 ID字段。默认情况下,ID 字段假定基础数据库列名为 id;但是,如果需要,可以将列名作为第二个参数传递给 make 方法:

php
use Laravel\Nova\Fields\ID;

ID::make(),

ID::make('ID', 'id_column'),

如果你的应用程序包含非常大的整数 ID,您可能需要使用 asBigInt 方法,以便 Nova 客户端正确呈现整数:

php
ID::make()->asBigInt(),

ID 字段

每个资源只能配置一个 ID 字段。

Image 图像字段

Image 字段继承于 File 文件字段 ,接受相同的参数和配置。与 File 字段的区别在于, Image 字段将在查看资源时显示基础图像的缩列图预览:

php
use Laravel\Nova\Fields\Image;

Image::make('Photo'),

默认情况下,Image 字段允许用户下载链接的文件。要禁用下载,可以在字段定义中使用 disableDownload 方法:

php
Image::make('Photo')->disableDownload(),

你可以使用 squared 方法来显示带有方形边缘的图像缩略图。此外,你可以使用 rounded 方法来显示具有完全圆角边缘的缩略图。

File 文件字段

要了解有关定义文件字段和处理上传的更多信息,要了解更多信息, 请查看 文件字段.

KeyValue 键值对象字段

KeyValue 字段提供了一个方便的界面,用于编辑存储在 JSON 列类型中的一维键值数据。例如,你可以将配置文件信息存储在名为metaJSON 列类型 中:

php
use Laravel\Nova\Fields\KeyValue;

KeyValue::make('Meta')->rules('json'),

鉴于上述字段定义,Nova 将呈现以下界面:

Key/Value Field

自定义键值名称标签

通过在定义字段时调用 keyLabel, valueLabel, 和 actionText 方法,可以自定义组件中使用的文本值。actionText 方法可自定义 「添加行」按钮文本:

php
KeyValue::make('Meta')
    ->keyLabel('Item')
    ->valueLabel('Label')
    ->actionText('Add Item'),

KeyValue 键值对象字段和列表页

默认情况下,Nova 永远不会在资源索引列表上显示 KeyValue 字段。

如果要禁用用户编辑字段键的功能,可以使用 disableEditingKeys 方法来完成此操作。使用 disableEditingKeys 方法禁用编辑键也将自动禁用添加行:

php
KeyValue::make('Meta')->disableEditingKeys(),

你还可以通过将 disableAddingRows 方法链接到字段的定义上来删除用户向字段添加新行的能力:

php
KeyValue::make('Meta')->disableAddingRows(),

此外,你可能还希望删除用户删除字段中现有行的功能。你可以通过在定义字段时调用 disableDeletingRows 方法来实现这一点:

php
KeyValue::make('Meta')->disableDeletingRows(),

Markdown 字段

Markdown 字段为其底层 Eloquent 属性提供所见即所得的 Markdown 编辑器。通常,此字段将对应于数据库中的 TEXT 类型的列。Markdown 字段将在相关数据库列中存储原始 Markdown 文本:

php
use Laravel\Nova\Fields\Markdown;

Markdown::make('Biography'),

默认情况下,在查看资源的详细信息页面时,Markdown 字段不会显示其内容。相反,内容将隐藏在「显示内容」链接后面,该链接将在单击时显示字段的内容。你可以通过对字段本身调用 alwaysShow 方法来指定 Markdown 字段应始终显示其内容:

php
Markdown::make('Biography')->alwaysShow(),

Markdown 字段使用 league/commonmark 包来解析 Markdown 内容。默认情况下,它使用类似于 GitHub Flavored Markdown 的解析策略,不允许在 Markdown 内容中使用某些 HTML。但是,你可以使用 preset 方法更改解析策略。目前,以下内置预设为 default, commonmark, 和 zero:

php
Markdown::make('Biography')->preset('commonmark'),

使用 preset 方法,你可以注册并使用自定义预设实现:

php
use Illuminate\Support\Str;
use Laravel\Nova\Fields\Markdown;
use Laravel\Nova\Fields\Markdown\MarkdownPreset;

Markdown::make('Biography')->preset('github', new class implements MarkdownPreset {
    /**
     * 将给定的内容从 markdown 转换为 HTML。
     *
     * @param  string  $content
     * @return string
     */
    public function convert(string $content)
    {
        return Str::of($content)->markdown([
            'html_input' => 'strip',
        ]);
    }
}),

Markdown 文件上传

如果你想允许用户将图片拖放到 Markdown 字段中,可以将 withFiles 方法链接到字段的定义中。调用 withFiles 方法时,应传递图片应存储在的 文件磁盘)的名称:

php
use Laravel\Nova\Fields\Markdown;

Markdown::make('Biography')->withFiles('public'),

Nova 将定义两个数据库表来存储挂起的和持久的 Field 上传。在安装期间运行 Nova 的迁移时,将自动创建这两个表:nova_pending_field_attachmentsnova_field_attachments

最后,在 app/Console/Kernel.php 文件中,你应该注册一个 每日计划任务,以从挂起的附件表和存储中删除任何过期的附件。为了方便起见,Laravel Nova 提供了实现这一目标所需的工作实施:

php
use Laravel\Nova\Fields\Attachments\PruneStaleAttachments;

$schedule->call(new PruneStaleAttachments)->daily();

MultiSelect 多选字段

MultiSelect 字段提供了一个 Select 字段,允许选择多个选项。该字段与转换为 array 或等效的模型属性很好地配对:

php
use Laravel\Nova\Fields\MultiSelect;

MultiSelect::make('Sizes')->options([
    'S' => 'Small',
    'M' => 'Medium',
    'L' => 'Large',
]),

在资源索引和详细信息页面上,将显示 MultiSelect 字段的「键」值。如果你想显示标签值,可以在定义字段时调用 displayUsingLabels 方法:

php
MultiSelect::make('Size')->options([
    'S' => 'Small',
    'M' => 'Medium',
    'L' => 'Large',
])->displayUsingLabels(),

你还可以通过提供包含键和 label / group 对的数组结构来显示成组的多选选项:

php
MultiSelect::make('Sizes')->options([
    'MS' => ['label' => 'Small', 'group' => "Men's Sizes"],
    'MM' => ['label' => 'Medium', 'group' => "Men's Sizes"],
    'WS' => ['label' => 'Small', 'group' => "Women's Sizes"],
    'WM' => ['label' => 'Medium', 'group' => "Women's Sizes"],
])->displayUsingLabels(),

Number 数字字段

Number 字段提供了一个 input 控件,其 type 属性值为 number

php
use Laravel\Nova\Fields\Number;

Number::make('price'),

你可以在生成的 input 控件上,使用 min, max, 和 step 方法设置相应属性:

php
Number::make('price')->min(1)->max(1000)->step(0.01),

你还可以允许使用任意精度的十进制值:

php
Number::make('price')->min(1)->max(1000)->step('any'),

Password 密码字段

Password 字段提供了一个 input 控件,其 type 属性值为 password

php
use Laravel\Nova\Fields\Password;

Password::make('Password'),

当输入密码为空时,Password 字段会自动保留存储在数据库中的密码。因此,典型的密码字段定义看起来就像下面这样:

php
use Illuminate\Validation\Rules;

Password::make('Password')
    ->onlyOnForms()
    ->creationRules('required', Rules\Password::defaults())
    ->updateRules('nullable', Rules\Password::defaults()),

Password 密码确认字段

PasswordConfirmation 字段提供可用于确认另一个 Password 字段的输入。该字段仅显示在表单上,不会试图在 Eloquent 模型上对基础属性进行赋值:

php
PasswordConfirmation::make('Password Confirmation'),

使用此字段时,应在相应的 Password 字段上定义适当的验证规则:

php
Password::make('Password')
    ->onlyOnForms()
    ->creationRules('required', Rules\Password::defaults(), 'confirmed')
    ->updateRules('nullable', Rules\Password::defaults(), 'confirmed'),

PasswordConfirmation::make('Password Confirmation'),

Select 选择字段

Select 字段用于生成下拉选择菜单。可以使用 options 方法定义菜单选项:

php
use Laravel\Nova\Fields\Select;

Select::make('Size')->options([
    'S' => 'Small',
    'M' => 'Medium',
    'L' => 'Large',
]),

在资源的索引和详情界面,将显示 Select 字段的键值。 如果你想要显示标签,可以使用 displayUsingLabels 方法:

php
Select::make('Size')->options([
    'S' => 'Small',
    'M' => 'Medium',
    'L' => 'Large',
])->displayUsingLabels(),

你还可以通过提供一个包含键和 label / group 对的数组结构来分组显示 Select 选项:

php
Select::make('Size')->options([
    'MS' => ['label' => 'Small', 'group' => 'Men Sizes'],
    'MM' => ['label' => 'Medium', 'group' => 'Men Sizes'],
    'WS' => ['label' => 'Small', 'group' => 'Women Sizes'],
    'WM' => ['label' => 'Medium', 'group' => 'Women Sizes'],
])->displayUsingLabels(),

如果你需要对 Select 字段的选项的生成进行更多控制,则可以为 options 方法提供一个闭包:

php
Select::make('Size')->options(function () {
    return array_filter([
        Size::SMALL => Size::MAX_SIZE === SIZE_SMALL ? 'Small' : null,
        Size::MEDIUM => Size::MAX_SIZE === SIZE_MEDIUM ? 'Medium' : null,
        Size::LARGE => Size::MAX_SIZE === SIZE_LARGE ? 'Large' : null,
    ]);
}),

可搜索的选择字段

有时,可以方便地搜索或筛选 Select 字段中的可用选项列表。你可以通过调用字段上的 searchable 方法来启用此功能:

php
Select::make('Size')->searchable()->options([
    'S' => 'Small',
    'M' => 'Medium',
    'L' => 'Large',
])->displayUsingLabels(),

在将选择字段标记为 searchable 后,Nova 将显示一个 input 字段,允许你根据其标签筛选选项列表:

Searchable Select Fields

Slug 别名字段

有时,你可能需要根据另一个字段的内容生成一个唯一的、可读的标识符,例如在为博客文章标题生成「slug」时。你可以使用 Slug 字段自动生成这些「slugs」:

php
Slug::make('Slug')->from('Title'),

默认情况下,该字段会将 'My Blog Post' 之类的字符串转换为 'my-blog-post' 。如果你希望字段使用下划线而不是短划线,则可以使用 separator 方法定义自己的自定义「分隔符」:

php
Slug::make('Slug')->from('Title')->separator('_'),

Sparkline 迷你图字段

Sparkline 字段可用于在资源的索引或详细信息页上显示线形图。提供给 Sparkline 的数据可以通过 arraycallable(返回数组)或 Trend 度量类的实例提供:

php
// 使用数组...
Sparkline::make('Post Views')->data([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),

// 使用回调...
Sparkline::make('Post Views')->data(function () {
    return json_decode($this->views_data);
}),

使用趋势度量

如果你的 Sparkline 字段所需的数据需要复杂的数据库查询来计算,你可能希望将数据检索封装在 trend metric 中,然后可以将其提供给 Sparkline 字段:

php
Sparkline::make('Post Views')->data(new PostViewsOverTime($this->id)),

在上面的例子中,我们将 post 的 id 提供给度量的构造函数。该值将成为趋势度量中可用的请求的 resourceId 属性。例如,在度量中,我们可以通过 $request->resourceId 访问此帖子ID:

php
return $this->countByDays(
    $request,
    PostView::where('post_id', '=', $request->resourceId)
);

默认范围

当通过趋势度量向 Sparkline 字段提供数据时,Sparkline 字段将始终使用度量的 ranges 方法中定义的第一个范围。

自定义图表

如果条形图更适合你的数据,你可以在定义字段时调用 asBarChart 方法:

php
Sparkline::make('Post Views')
           ->data([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
           ->asBarChart(),

默认情况下,Sparkline 将出现在资源的详细信息页面上。你可以使用 heightwidth 方法自定义图表的尺寸:

php
Sparkline::make('Post Views')
           ->data([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
           ->height(200)
           ->width(600),

Status 状态字段

Status 字段用于显示「进度状态」。Nova 使用 Status 字段指示排队操作的当前状态(等待,运行中,已完成)。 你可以根据具体情况定义这个字段:

Status Field Example

loadingWhenfailedWhen 方法可用于指示字段哪些字表示 「loading」 状态,哪些字表示为「failed」状态。 例如,我们定义数据库列的 「loading」 指示符为 waiting 或者 running

php
use Laravel\Nova\Fields\Status;

Status::make('Status')
    ->loadingWhen(['waiting', 'running'])
    ->failedWhen(['failed']),

Stack 堆栈字段

随着资源类的增长,你可能会发现将字段分组在一起以简化索引和详细信息视图非常有用。Stack 字段允许你以垂直方向显示 BelongsTo, Text 等字段:

php
Stack::make('Details', [
    Text::make('Name'),
    Text::make('Slug')->resolveUsing(function () {
        return Str::slug(optional($this->resource)->name);
    }),
]),

Stack Field

Stack 字段在编辑表单不显示,仅用于堆叠索引和详细信息资源视图上的文本行。

Line 行字段

为了更好地控制 Stack 中各个字段的显示方式,可以使用 Line 字段,该字段提供了控制行文本显示的方法。Line 字段提供以下表示方法:

  • asHeading
  • asSubTitle
  • asSmall
  • asBase

Line presentational methods

除了 Line 字段的表示方法外,你还可以向该字段传递任何附加的 Tailwind 类,以自定义 Line 的外观:

php
Stack::make('Details', [
    Line::make('Title')->extraClasses('italic font-medium text-80'),
]),

将闭包传递给行字段

除了将 BelongsTo, Text, 和 Line 字段传递到 Stack 字段之外,还可以传递闭包。闭包的结果将自动转换为 Line 实例:

php
Stack::make('Details', [
    Line::make('Name')->asHeading(),
    fn () => optional($this->resource)->position
]),

Tag 标签字段

Tag 字段允许你使用标记选择界面搜索和附加 BelongsToMany 关系。此字段可用于向用户添加角色、标记文章、为书籍分配作者以及其他类似场景:

php
use Laravel\Nova\Fields\Tag;

Tag::make('Tags'),

Tag Field

Tag 字段将显示在索引视图的下拉列表中:

Tag Field on index views

预览标签

你可以通过调用字段上的 withPreview 方法,指示 Tag 字段允许预览关联的标签。这将以模式显示相关资源的预览详细信息:

php
use Laravel\Nova\Fields\Tag;

Tag::make('Tags')->withPreview(),

Previewing Tags

将标签显示为列表

你可以将你的标签显示为列表,而不是将标签显示为内联组:

php
use Laravel\Nova\Fields\Tag;

Tag::make('Tags')->displayAsList(),

这允许标签显示其标题、副标题和配置的图像字段:

Tag field displayed as a list

Tag field displayed as a list

内联创建新标签

为方便起见,当 Tag 字段显示在资源创建或更新页面上时,你可以通过模式窗口内联创建相关资源,而无需离开创建更新页面:

Creating Tags Inline

要启用此功能,请在定义字段时调用 showCreateRelationButton 方法:

php
use Laravel\Nova\Fields\Tag;

Tag::make('Tags')->showCreateRelationButton(),

调整内联创建模式的大小

你可以使用 modalSize 方法调整模式的大小:

php
// 可以使用 "sm", "md", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "7xl".
Tag::make('Tags')->showCreateRelationButton()->modalSize('7xl'),

预加载可用标签

为了使现有标签更容易被发现,你可以在定义字段时调用 preload 方法,在资源创建或更新期间向用户显示所有可用标记:

php
Tag::make('Tags')->preload(),

Text 文本字段

Text 字段提供了一个 type 属性为 textinput 控件:

php
use Laravel\Nova\Fields\Text;

Text::make('Name'),

可以通过设置字段上的任何属性来进一步自定义文本字段。这可以通过调用 withMeta 方法并提供包含 HTML 属性 键/值 对的 extraAttributes 数组来实现:

php
Text::make('Name')->withMeta([
    'extraAttributes' => [
        'placeholder' => 'David Hemphill',
    ],
]),

文本字段建议提示

要在键入 Text 字段时提供自动完成建议,你可以在定义字段时调用 suggestions 方法。suggestions 方法应返回建议的数组 array

php
Text::make('Name')->required()
    ->suggestions([
        'David Hemphill',
        'Taylor Otwell',
        'James Brooks',
    ]),

Field Suggestions

将文本格式化为链接

要将 Text 字段格式化为链接,你可以在定义字段时调用 asHtml 方法:

php
Text::make('Twitter Profile', function () {
    $username = $this->twitterUsername;

    return "<a href='https://twitter.com/{$username}'>@{$username}</a>";
})->asHtml(),

将文本字段值复制到剪贴板

有时,你可能希望将字段的值复制到系统剪贴板中,以便粘贴到其他位置。通过在 Text 字段上调用 copyable 方法,可以在资源的详细信息视图中启用此功能:

php
Text::make('Twitter Profile')->copyable(),

在文本字段上设置最高长度 maxlength

你可能希望向用户指示 Text 字段的内容应保持在一定长度内。你可以通过在字段上使用 maxlength 方法来完成此操作:

php
use Laravel\Nova\Fields\Text;

Text::make('Name')->maxlength(250),

Nova 将显示字段的最大长度以及字符计数器。然而,Nova 不会强制执行最大长度。要指示 Nova 强制执行限制,可以在字段上调用 enforceMaxlength 方法:

php
use Laravel\Nova\Fields\Text;

Text::make('Name')->maxlength(250)->enforceMaxlength(),

Textarea 文本区域字段

Textarea 字段提供一个 textarea 控件:

php
use Laravel\Nova\Fields\Textarea;

Textarea::make('Biography'),

默认情况下,在查看资源的详细信息页面时,文本区域字段不会显示其内容。相反,该字段的内容将隐藏在「显示内容」链接后面,该链接将在单击时显示内容。但是,如果你愿意,可以通过调用字段上的 alwaysShow 方法来指定 Textarea 字段应始终显示其内容:

php
Textarea::make('Biography')->alwaysShow(),

你可以通过调用字段上的 rows 方法来指定 Textarea 高度:

php
Textarea::make('Excerpt')->rows(3),

可以通过设置字段上的任何属性来进一步自定义 Textarea 字段。这可以通过调用 withMeta 方法并提供包含 HTML 属性 键/值 对的 extraAttributes 数组来实现:

php
Textarea::make('Excerpt')->withMeta(['extraAttributes' => [
    'placeholder' => 'Make it less than 50 characters']
]),

在文本区域字段上设置最高长度 maxlength

你可能希望向用户指示 Textarea 字段的内容应保持在一定长度内。你可以通过在字段上使用 maxlength 方法来完成此操作:

php
use Laravel\Nova\Fields\Textarea;

Textarea::make('Name')->maxlength(250),

Nova 将显示字段的最大长度以及字符计数器。然而,Nova 不会强制执行最大长度。要指示 Nova 强制执行限制,可以在字段上调用 enforceMaxlength 方法:

php
use Laravel\Nova\Fields\Textarea;

Textarea::make('Name')->maxlength(250)->enforceMaxlength(),

Timezone 时区字段

Timezone 时区字段 生成一个包含世界时区的 Select 字段:

php
use Laravel\Nova\Fields\Timezone;

Timezone::make('Timezone'),

Trix 编辑器字段

Trix 字段为其关联的字段提供一个 Trix 编辑器。通常,这个字段将和你数据库中的 TEXT 列对应。Trix 字段将为其对应的数据列存储对应的 Html:

php
use Laravel\Nova\Fields\Trix;

Trix::make('Biography'),

默认情况下,Trix 字段在其详细信息页面上查看资源时不会显示其内容。相反,内容将隐藏在「显示内容」链接后面,单击该链接时将显示字段的内容。如果你愿意,可以指定 Trix 字段在定义字段时应始终通过调用 alwaysShow 方法来显示其内容:

php
Trix::make('Biography')->alwaysShow(),

Trix 文件上传

如果你想允许用户将图片拖放到 Trix 字段中,可以将 withFiles 方法链接到字段的定义中。调用 withFiles 方法时,应传递图片应存储在的 文件存储磁盘的名称:

php
use Laravel\Nova\Fields\Trix;

Trix::make('Biography')->withFiles('public'),

Nova 将定义两个数据库表来存储挂起的和持久的 Field 上传。在安装期间运行 Nova 的迁移时,将自动创建这两个表:nova_pending_field_attachmentsnova_field_attachments

最后,在 app/Console/Kernel.php 文件中,你应该注册一个 每日计划任务,以从挂起的附件表和存储中删除任何过期的附件。为了方便起见,Laravel Nova 提供了实现这一目标所需的工作实施:

php
use Laravel\Nova\Fields\Attachments\PruneStaleAttachments;

$schedule->call(new PruneStaleAttachments)->daily();

UI-Avatar UI头像字段

UiAvatar 字段与应用程序数据库中的任何列都不对应。相反,此字段将生成一个包含用户首字母缩写的简单头像。该字段由 ui-avatars.com 提供支持。

默认情况下,将根据模型的 name 列的值生成 UiAvatar 图像。但是,如果用户名未存储在 name 列中,则可以将自定义列名传递给字段的 make 方法:

php
use Laravel\Nova\Fields\UiAvatar;

// 使用 "name" 列...
UiAvatar::make(),

// 使用自定义列...
UiAvatar::make('Avatar', 'full_name'),

如有必要,你可以调用 resolveUsing 方法来指定应调用的闭包,以确定应用于生成化身的名称:

php
UiAvatar::make()->resolveUsing(function () {
    return implode(' ', explode('@', $this->email));
}),

你可以使用 squared 方法来显示带有方形边缘的图像缩略图。此外,你可以使用 rounded 方法来显示具有完全圆角边缘的图像:

php
UiAvatar::make('Avatar', 'fullname')->squared(),

定义 UiAvatar 字段时可用的其他选项包括:

OptionMethodDescription
文字大小fontSize(0.4)将字体大小设置为介于从 0.11.
加粗bold()将字体设置为粗体.
背景颜色backgroundColor('1D4ED7')设置图像背景的十六进制颜色.
文本颜色color('FFFFFF')设置图像文本的十六进制颜色.

URL 字段

URL 字段将 URL 呈现为可单击的链接,而不是纯文本:

php
URL::make('GitHub URL'),

URL 字段还支持通过在定义字段时调用 displayUsing 方法来自定义生成的链接的文本。 displayUsing 方法接受一个闭包,该闭包应返回链接的文本:

php
URL::make('Receipt')
    ->displayUsing(fn () => "{optional($this->user)->name}'s receipt")

通过提供闭包作为 URL 字段的第二个参数,你可以使用该字段来呈现计算值的链接,该值不一定与关联模型的数据库表中的列相对应:

php
URL::make('Receipt', fn () => $this->receipt_url)

Vapor 文件字段

Vapor 文件字段在使用 Laravel Vapor 将应用程序部署到无服务器环境时为上传文件提供了便利和兼容性:

php
use Laravel\Nova\Fields\VaporFile;

VaporFile::make('Document'),

当使用 VaporFile 字段上传文件时,Nova 将首先在 Amazon S3 上生成一个签名存储 URL。接下来,Nova 将直接将文件上传到 Amazon S3 存储桶中的临时存储中。保存资源后,Nova 会将文件移动到永久存储中。

Vapor 存储

有关如何为 Vapor 应用程序处理文件存储的更多信息, 请查看 Laravel Vapor storage documentation.

Vapor 图像字段

Vapor文件字段在无服务器环境中使用 Laravel Vapor 部署应用程序时,为上传图像文件提供了便利和兼容性:

php
use Laravel\Nova\Fields\VaporImage;

VaporImage::make('Avatar'),

Vapor image 字段继承于 Image ,接受相同的参数和配置。

文件字段

了解有关定义文件字段和处理上传的详细信息, 请查看文档 file field documentation.

验证Vapor 图像/文件 字段

为了验证 Vapor 文件的大小或其他属性,你需要直接通过Storage 门面检查文件:

php
use Illuminate\Support\Facades\Storage;

VaporFile::make('Document')
    ->rules('bail', 'required', function ($attribute, $value, $fail) use ($request) {
        if (Storage::size($request->input('vaporFile')[$attribute]['key']) > 1000000) {
            return $fail('The document size may not be greater than 1 MB');
        }
    }),

计算字段

除了显示与数据库中的列直接关联的字段外,Nova 还允许您创建「计算字段」。计算字段可用于显示与数据库列不关联的计算值。由于它们与数据库列没有关联,因此计算字段可能不能使用排序 sortable 。可以通过将可调用的(而不是列名)作为第二个参数传递给字段的 make 方法来创建这些字段:

php
Text::make('Name', function () {
    return $this->first_name.' '.$this->last_name;
}),

模型实例将传递给可调用的计算字段,允许你在计算字段值时访问模型的属性:

php
Text::make('Name', function ($model) {
    return $model->first_name.' '.$model->last_name;
}),

模型属性访问

正如你在上面的示例中可能注意到的那样,你也可以使用 $this 来访问资源的底层模型属性和关系。

默认情况下,Vue 将转义计算字段的内容。如果需要在字段中呈现 HTML 内容,请在定义字段时调用 asHtml 方法:

php
Text::make('Status', function () {
    return view('partials.status', [
        'isPassing' => $this->isPassing(),
    ])->render();
})->asHtml(),

自定义

Readonly 只读字段

有时,你可能希望允许用户只创建和更新资源上的某些字段。你可以通过调用字段上的 readonly 方法将字段标记为「只读」,这将禁用字段的相应输入。你可以将布尔参数传递给 readonly 法,以动态控制字段是否应为「只读」:

php
Text::make('Email')->readonly(optional($this->resource)->trashed()),

你也可以将闭包传递给 readonly 方法,闭包的结果将用于确定字段是否应为「只读」。闭包将接收当前的 NovaRequest 作为其第一个参数:

php
Text::make('Email')->readonly(function ($request) {
    return ! $request->user()->isAdmin();
}),

如果在创建或附加资源时只想将字段标记为「只读」,则可以分别使用 NovaRequest 实例提供的 isCreateOrAttachRequestisUpdateOrUpdateAttachedRequest 方法:

php
Text::make('Email')->readonly(function ($request) {
    return $request->isUpdateOrUpdateAttachedRequest();
}),

Required 必填字段

默认情况下,Nova 将使用红色星号表示必填字段:

Required Fields

Nova 通过在字段的验证规则中查找 required 规则来确定它是否应该显示所需状态。例如,具有以下定义的字段将收到一个 「必需」 指示符:

php
Text::make('Email')->rules('required'),

当你有复杂的 required 验证要求时,你可以在定义字段时通过向 required 方法传递布尔值来手动将字段标记为必需。这将通知 Nova,UI 中应显示「必需」指示符:

php
Text::make('Email')->required(true),

此外,你还可以将闭包传递给 required 方法,以确定字段是否应标记为「必需」。闭包将收到一个 NovaRequest 实例。闭包返回的值将用于确定是否需要字段:

php
use Illuminate\Validation\Rule;

Text::make('Email')->required(function ($request) {
    return $this->notify_via_email;
}),

required() 局限性

required() 方法只会在 Nova UI中添加一个「必需」指示符。你仍然必须定义应在验证期间应用的相关需求规则 rules()

Nullable 可为空字段

默认情况下,Nova 会尝试用一个值存储所有字段,但是,有时当字段为空时,你可能更希望 Nova 在相应的数据库列中存储 null 值。为此,你可以在字段定义中调用 nullable 方法:

php
Text::make('Position')->nullable(),

你还可以使用 nullValues 方法设置哪些值应被解释为 null 值,该方法接受数组或闭包作为其唯一参数:

php
Text::make('Position')->nullable()->nullValues(['', '0', 'null']),

Text::make('Position')->nullable()->nullValues(function ($value) {
    return $value == '' || $value == 'null' || (int)$value === 0;
}),

字段帮助提示信息

如果你想将帮助提示文本放在字段下面,则可以在定义字段时调用 help 方法:

php
Text::make('Tax Rate')->help(
    'The tax rate to be applied to the sale'
),

如有必要,你可以在字段的帮助文本中包含 HTML,以进一步自定义帮助文本:

php
Text::make('First Name')->help(
    '<a href="#">External Link</a>'
),

Text::make('Last Name')->help(
    view('partials.help-text', ['name' => $this->name])->render()
),

字段堆叠

默认情况下,Nova 会在创建更新表单的标签旁边显示字段,但某些字段(如 "Code", "Markdown", 和 "Trix")可能会受益于将字段放置在相应标签下所获得的额外宽度。字段可以使用 stacked 方法堆叠在其标签下方:

php
Trix::make('Content')->stacked(),

全屏宽度字段

你可以使用 fullWidth 方法指示字段应为全屏宽度:

php
Trix::make('Content')->fullWidth(),

字段文本对齐方式

你可以使用 textAlign 方法更改字段的文本对齐方式:

php
Text::make('Phone Number')->textAlign('left'),

支持以下参数:

  • left
  • center
  • right

字段 映射 / 格式化

resolveUsing 方法允许你自定义字段在从数据库中检索之后但在发送到 Nova 前端之前的格式化方式。此方法接受一个回调,该回调接收基础数据库列的原始值:

php
Text::make('Name')->resolveUsing(function ($name) {
    return strtoupper($name);
}),

如果你想自定义字段只有在资源的「索引」或「详细信息」页上显示时的格式,可以使用 displayUsing 方法。与 resolveUsing 方法一样,此方法接受单个回调:

php
Text::make('Name')->displayUsing(function ($name) {
    return strtoupper($name);
}),

可筛选字段

filterable 方法允许你为给定的资源、关系和镜头字段启用方便、自动的 搜索)功能。Nova 生成的过滤器将通过资源索引上的资源过滤器菜单自动提供:

php
DateTime::make('Created At')->filterable(),

Filterable fields

filterable 方法也接受闭包作为参数。此闭包将接收筛选查询,然后你可以自定义该查询,以便根据自己的喜好筛选资源结果:

php
Text::make('Email')->filterable(function ($request, $query, $value, $attribute) {
    $query->where($attribute, 'LIKE', "{$value}%");
}),

根据标记为可筛选的基础字段类型,生成的筛选器将是文本筛选器、选择筛选器、数字范围筛选器或日期范围筛选器。

依赖字段

dependsOn 方法允许你指定字段的配置取决于一个或多个其他字段的值。dependsOn 方法接受依赖字段属性的数组 array 和修改当前字段实例配置的闭包。

依赖字段允许高级自定义,例如根据另一个字段的状态切换只读模式、验证规则等:

php
use Laravel\Nova\Fields\FormData;
use Laravel\Nova\Fields\Select;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;

Select::make('Purchase Type', 'type')
    ->options([
        'personal' => 'Personal',
        'gift' => 'Gift',
    ]),

// 收件人字段配置是根据购买类型自定义的...
Text::make('Recipient')
    ->readonly()
    ->dependsOn(
        ['type'],
        function (Text $field, NovaRequest $request, FormData $formData) {
            if ($formData->type === 'gift') {
                $field->readonly(false)->rules(['required', 'email']);
            }
        }
    ),

要分别定义用于创建和更新资源的依赖字段,可以使用 dependsOnCreatingdependsOnUpdating 方法。

支持的相关字段

以下字段类型可依赖其他字段:

  • Audio
  • BelongsTo
  • Boolean
  • BooleanGroup
  • Color
  • Code
  • Country
  • Currency
  • Date
  • DateTime
  • File
  • Heading
  • Hidden
  • Image
  • KeyValue
  • Markdown
  • MorphTo
  • Number
  • Password
  • PasswordConfirmation
  • Select
  • Status
  • Textarea
  • Text
  • Timezone
  • Trix
  • URL
  • VaporAudio
  • VaporFile
  • VaporImage

以下字段类型可能不受其他字段的依赖,因为它们不会向 Nova 实时报告其更改:

  • Audio
  • Code
  • File
  • Image
  • KeyValue
  • Status
  • Tag
  • Trix
  • VaporAudio
  • VaporFile
  • VaporImage

使用 dependsOn 切换字段可见性

依赖字段的一个常见用例是基于另一个字段的值来切换字段可见性。你可以使用 hideshow 方法来完成此操作:

php
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\FormData;
use Laravel\Nova\Http\Requests\NovaRequest;

Boolean::make('Anonymous Comment', 'anonymous')
    ->default(true),

BelongsTo::make('User')
    ->hide()
    ->rules('sometimes')
    ->dependsOn('anonymous', function (BelongsTo $field, NovaRequest $request, FormData $formData) {
        if ($formData->boolean('anonymous') === false) {
            $field->show()->rules('required');
        }
    }),

使用 dependsOn 设置字段的值

依赖字段的另一个常见用例是根据另一个字段的值设置字段的值。你可以使用 setValue 方法来完成此操作:

php
use Laravel\Nova\Fields\DateTime;
use Laravel\Nova\Fields\FormData;
use Laravel\Nova\Http\Requests\NovaRequest;

DateTime::make('Created At'),

DateTime::make('Updated At')->dependsOn(['created_at'], function (DateTime $field, NovaRequest $request, FormData $form) {
    $field->setValue(Carbon::parse($form->created_at)->addDays(7));
}),

访问请求资源ID

当与依赖字段交互时,你可以通过 resource 方法检索当前资源和相关资源ID:

php
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\Currency;

BelongsTo::make(__('Books'), 'books', Book::class),

Currency::make('Price')
    ->dependsOn('books', function ($field, NovaRequest $request, $formData) {
        $bookId = (int) $formData->resource(Book::uriKey(), $formData->books);

        if ($bookId == 1) {
            $field->rules([
                'required', 'numeric', 'min:10', 'max:199'
            ])->help('Price starts from $10-$199');

            return;
        }

        $field->rules([
            'required', 'numeric', 'min:0', 'max:99'
        ])->help('Price starts from $0-$99');
    }),

扩展字段

字段是「可扩展的」,允许你在运行时向 Field 类添加其他方法。Fieldmacro 方法接受一个闭包,该闭包将在调用宏时执行。宏闭包可以通过 $this 访问字段的其他方法,就像它是字段类的真实方法一样。例如,以下代码将 toUpper 方法添加到 Field 类中:

php
use Illuminate\Support\Str;
use Laravel\Nova\Fields\Field;

Field::macro('toUpper', function () {
    return $this->displayUsing(function ($value) {
        return Str::upper($value);
    });
});

一旦定义了宏,就可以在定义任何字段时使用它:

php
Text::make('Name')->toUpper(),

宏参数

如有必要,可以定义接受其他参数的宏:

php
use Laravel\Nova\Fields\Field;

Field::macro('showWhen', function ($condition) {
    $condition === true ? $this->show() : $this->hide();

    return $this;
});

特定字段上的宏

你也可以仅将宏添加到特定类型的 Field 中。例如,你可以将 withFriendlyDate 宏添加到 DateTime 字段类中:

php
use Laravel\Nova\Fields\DateTime;

DateTime::macro('withFriendlyDate', function () {
    return $this->tap(function ($field) {
        $field->displayUsing(function ($d) use ($field) {
            if ($field->isValidNullValue($d)) {
                return null;
            }

            return Carbon::parse($d)->diffForHumans();
        });
    });
});