每个 Nova 资源均包含一个 fields 方法。此方法返回一个字段数组,每个字段通常继承了 Laravel\Nova\Fields\Field 类。Nova 提供了各种开箱即用的字段,包括文本输入、布尔、日期、文件上传、 Markdown 等多种字段。
要向资源添加字段,我们只需将它加入到资源的 fields 方法内。通常,可以使用字段的静态 make 方法创建字段。此方法会接受几个参数;但是,通常只需传递一个「易于阅读的」字段名称。Nova 对此名称应用「蛇形命名法(下划线命名法)」以确定对应的底层数据库列:
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 方法:
Text::make('Name', 'name_column'),如果字段分配了JSON、ArrayObject 或数组强制转换,则可以使用 -> 运算符在字段中指定嵌套属性:
Timezone::make('User Timezone', 'settings->timezone'),你经常会在某些场景下只想显示某个字段。例如,你通常有一个在查询列表中无需显示的 Password 字段。同样地,你也想在「创建 / 更新表单」里只显示 Created At 字段。Nova 可以轻松实现在页面上 显示 / 隐藏 字段。
下面的方法可在显示的上下文里 显示 / 隐藏 字段:
showOnIndexshowOnDetailshowOnCreatingshowOnUpdatingshowOnPreviewshowWhenPeekinghideFromIndexhideFromDetailhideWhenCreatinghideWhenUpdatingonlyOnIndexonlyOnDetailonlyOnFormsexceptOnForms你可以在字段定义时链式调用这些方法,以指示 Nova 在哪里可以 显示 / 隐藏 字段:
Text::make('Name')->hideFromIndex(),或者,你可以将回调传递给以下方法。
showOnIndexshowOnDetailshowOnCreatingshowOnUpdatingshowWhenPeekinghideFromIndexhideFromDetailhideWhenCreatinghideWhenUpdatingshowOnPreviewonlyOnPreview对于 show* 方法,如果给定的回调返回 true,则会显示该字段:
Text::make('Name')->showOnIndex(function (NovaRequest $request, $resource) {
return $this->name === 'Taylor Otwell';
}),对于 hide* 方法,如果给定的回调返回 true,则该字段将被隐藏:
Text::make('Name')->hideFromIndex(function (NovaRequest $request, $resource) {
return $this->name === 'Taylor Otwell';
}),通过在定义字段时调用 showWhenPeeking 方法,可以允许字段 在查看资源时 可见:
Text::make('Name')->showWhenPeeking(),你还可以定义哪些字段应该包含在资源的「预览」模式中。用户在查看资源索引时,可以为给定资源显示此模式:
Text::make('Title')->showOnPreview(),
Markdown::make('Content')->showOnPreview(),或者,你可以将回调传递给 showOnPreview 方法:
Markdown::make('Content')->showOnPreview(function (NovaRequest $request, $resource) {
return $request->user()->can('previewContent');
}),
如果应用程序需要,可以为特定的显示上下文指定单独的字段列表。例如,假设你有一个具有以下字段列表的资源:
/**
* 获取资源显示的字段。
*
* @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 方法,该方法返回一个单独的字段列表,该列表只应显示在资源的详细信息页面上:
/**
* 获取资源在详细信息页面上显示的字段。
*
* @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'),
];
}下面的方法可以为各个显示上下文定义:
fieldsForIndexfieldsForDetailfieldsForInlineCreatefieldsForCreatefieldsForUpdatefieldsForPreview动态字段方法优先级 ::
fieldsForIndex, fieldsForDetail, fieldsForInlineCreate, fieldsForCreate,fieldsForUpdate, 和 fieldsForPreview 方法优先级始终大于 fields 方法。
有时你可能希望为字段提供默认值。Nova 通过 default 方法提供此功能,该方法接受值或回调。此值将用作资源创建视图中字段的默认输入值:
BelongsTo::make('Name')->default($request->user()->getKey()),
Text::make('Uuid')->default(function ($request) {
return Str::orderedUuid();
}),默认情况下,字段的占位符提示文本将是其名称。你可以使用 placeholder 方法覆盖支持占位符的字段的占位符提示文本:
Text::make('Name')->placeholder('My New Post'),在 Nova 收到的每个针对给定资源的创建或更新请求中,在模型持久化到数据库之前,每个字段的相应模型属性都将自动填充。如有必要,你可以使用 fillUsing 方法自定义给定字段:
Text::make('Name', 'name')
->fillUsing(function ($request, $model, $attribute, $requestAttribute) {
$model->{$attribute} = Str::title($request->input($attribute));
}),如果你的资源包含很多字段,屏幕上资源的「详情页」会很拥挤。鉴于此,你可以选择把字段组拆分到它们自己的「面板」里:

你也可以通过在资源的 fields 方法里创建一个 Panel 实例实现此目的。每个 Panel 实例需要一个名称和一个属于它的字段数组:
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 方法限制面板中显示的字段数量:
Panel::make('Profile', [
Text::make('Full Name'),
Date::make('Date of Birth'),
Text::make('Place of Birth'),
])->limit(1),具有已定义字段限制的面板将显示显示所有字段按钮,以便用户在需要时查看所有已定义字段。
当向资源添加一个字段时,你可以使用 sortable 方法指示资源列表可以按照给定的字段排序:
Text::make('Name', 'name_column')->sortable(),关联字段
这部分文档只讨论非关联字段。了解关联字段的更多信息, 点击查看文档。
Nova 提供了丰富的字段类型。那么,让我们浏览一下所有的类型和相应选项:
Audio 字段继承了 File 字段,接受相同配置选项。与 File 字段不同,Audio 字段将在查看资源时显示基础图像的缩略图预览:

use Laravel\Nova\Fields\Audio;
Audio::make('Theme Song'),默认情况下,Audio 字段允许用户下载链接的文件。要禁用下载,可以在字段定义中使用 disableDownload 方法:
Audio::make('Theme Song')->disableDownload(),你可以使用 preload 方法设置字段的preload 字段:
Audio::make('Theme Song')->preload('auto'),
Audio::make('Theme Song')->preload(Audio::PRELOAD_METADATA),File 字段
要了解有关定义文件字段和处理上传的更多信息,请查看完整文档 file 字段。
Avatar 字段继承了 Image 字段 ,接受相同配置选项:
use Laravel\Nova\Fields\Avatar;
Avatar::make('Avatar'),如果一个资源包含 Avatar 字段,此字段会展示在搜索结果的资源标题旁边:
![]()
你可以使用 squared 方法来显示带有方形边缘的图像缩略图。此外,你可以使用 rounded 方法显示具有完全圆角边缘的缩略图:
Avatar::make('Avatar')->squared(),Badge 字段可用于在索引和详细信息视图中显示 Resource 的状态:
use Laravel\Nova\Fields\Badge;
Badge::make('Status', function () {
return User::statuses[$this->status];
}),默认情况下,Badge 字段支持四种显示方式:info, success, danger, and warning。你可以使用 map 方法自定义需要的字段值及其关联的徽章类型:
Badge::make('Status')->map([
'draft' => 'danger',
'published' => 'success',
]),或者,你可以使用 types 方法来完全替换内置的 Badge 类型及其关联的 CSS 类。CSS 类可以作为字符串或数组提供:
Badge::make('Status')->types([
'draft' => 'font-medium text-gray-600',
'published' => ['font-bold', 'text-green-600'],
]),如果你只想补充内置 Badge 类型,而不是覆盖所有徽章类型,则可以使用 addTypes 方法:
Badge::make('Status')->addTypes([
'draft' => 'custom classes',
]),编辑 Badge 类型
默认情况下,Badge 字段不会显示在资源的编辑或更新页面上。如果你希望修改编辑表单上 Badge 字段表示的基本值,请结合 onlyOnForms 字段选项定义另一个字段。
如果你想显示带有相关图标的 Badge,可以使用 withIcons 方法指示 Nova 显示图标:
Badge::make('Status')->map([
'draft' => 'danger',
'published' => 'success',
])->withIcons(),如果你想自定义显示 Badge 字段时使用的图标,可以使用 icons 方法:
Badge::make('Status')->map([
'draft' => 'danger',
'published' => 'success',
])->icons([
'danger' => 'exclamation-circle',
'success' => 'check-circle',
]),如果你想自定义显示的标签,可以使用 label 方法:
Badge::make('Status')->map([
'draft' => 'danger',
'published' => 'success',
])->label(function ($value) {
return __($value);
}),你可以使用 labels 方法提供自定义标签列表:
Badge::make('Status')->map([
'draft' => 'danger',
'published' => 'success',
])->labels([
'draft' => 'Draft',
'published' => 'Published',
]),Boolean 字段可以用来表示布尔或「短整数」型的数据库列。例如,假设你的数据库有一个叫做 active 的布尔型列,你就可以给资源添加一个 Boolean 字段,就像这样:
use Laravel\Nova\Fields\Boolean;
Boolean::make('Active'),如果使用 true, false, 1, 或 0 以外的值来表示「true」或「false」,可以指示 Nova 使用应用程序可识别的自定义值。为此,请在定义 Boolean 字段时链式调用 trueValue 和 falseValue 方法:
Boolean::make('Active')
->trueValue('On')
->falseValue('Off'),BooleanGroup 字段可用于对一组布尔复选框进行分组,然后将其作为 JSON 键值存储在所代表的数据库列中。你可以通过为每个选项提供一组键和标签来创建 BooleanGroup 字段:
use Laravel\Nova\Fields\BooleanGroup;
BooleanGroup::make('Permissions')->options([
'create' => 'Create',
'read' => 'Read',
'update' => 'Update',
'delete' => 'Delete',
]),用户将看到一组分组的复选框,保存后将转换为JSON格式:
{
"create": true,
"read": false,
"update": false,
"delete": false
}在使用此字段类型之前,应确保将基础 Eloquent 属性配置为强制转换为 Eloquent 模型类中的 array (或等效项):
protected $casts = [
'permissions' => 'array'
];有时,你可能希望从显示中排除 true 或 false 的值,以避免混淆字段的表示。你可以通过调用字段定义上的 hideFalseValues 或 hideTrueValues 方法来实现这一点:
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 方法自定义此文本:
BooleanGroup::make('Permissions')->options([
'create' => 'Create',
'read' => 'Read',
'update' => 'Update',
'delete' => 'Delete',
])->noValueText('No permissions selected.'),Code 字段为 Nova 后台管理面板提供了一个漂亮的代码编辑器。通常,Code 字段应该添加在 TEXT 型的数据库列上。
use Laravel\Nova\Fields\Code;
Code::make('Snippet'),你还可以将 Code 字段附加到 JSON 数据库列中。默认情况下,该字段将以 JSON 字符串的形式显示该值。你可以根据应用程序的需要将基础 Eloquent 属性强制转换为array、collection、 object, 或 json:
use Laravel\Nova\Fields\Code;
Code::make('Options')->json(),列表上的代码字段
默认,Nova 在资源列表里不显示 Code 字段。
如果打算对一个 Code 字段实例仅编辑 JSON,可以在字段定义时链式调用 json 方法:
Code::make('Options')->json(),代码字段 JSON 验证
Nova 不会自动将 json 验证规则应用于 Code 字段。如果希望应用此规则,则必须在验证期间手动指定此规则。
你可以使用 language 方法自定义 Code 字段相应语言的语法高亮:
Code::make('Snippet')->language('php'),Code 字段当前支持高亮的语言是:
dockerfilehtmlmixedjavascriptmarkdownnginxphprubysassshellsqltwigvimvuexmlyaml-frontmatteryamlColor 字段使用 HTML5 color 输入元素生成颜色选择器:
use Laravel\Nova\Fields\Color;
Color::make('Color', 'label_color'),Country 字段会生成一个包含了所有国家列表的 Select 字段。该字段将存储国家/地区对应的两个字母的代码:
use Laravel\Nova\Fields\Country;
Country::make('Country', 'country_code'),Currency 字段生成一个 Number 字段,该字段使用 brick/money PHP 包自动格式化。Nova 将使用 USD 作为默认货币;但是,这可以通过修改 nova.currency 配置值来更改:
use Laravel\Nova\Fields\Currency;
Currency::make('Price'),你可以使用 currency 方法来覆盖默认货币:
Currency::make('Price')->currency('EUR'),先决条件
PHP 扩展 ext-intl 是显示格式化货币所必需的。或者,你可以安装 symfony/polyfill-intl-icu Composer包,该包提供对「en」语言环境的支持。
你可以使用 min、max 和 step 方法在生成的 input 控件上设置相应的属性:
Currency::make('price')->min(1)->max(1000)->step(0.01),货币步长限制
如果你计划使用 step 方法自定义货币「step」金额,则应确保始终在 currency、asMinorUnits 和 asMajorUnits 方法之后调用 step。在 step 方法之后调用这些方法将覆盖 step 方法的行为。
字段的区域设置来自应用程序的 app.locale 配置值中的值。你可以通过向 locale 方法提供区域设置代码来覆盖此行为:
Currency::make('Price')->locale('fr'),Date 字段存储日期值(不包括时间)。要了解更多信息, 请查看 日期时间字段:
use Laravel\Nova\Fields\Date;
Date::make('Birthday'),DateTime 字段可以用来存储日期时间值。要了解更多信息, 请查看 日期时间字段:
use Laravel\Nova\Fields\DateTime;
DateTime::make('Updated At')->hideFromIndex(),Email 字段可用于在列表视图和详细信息视图上显示带有 mailto: 链接的列:
use Laravel\Nova\Fields\Email;
Email::make(),
Email::make('Customer Email', 'customer_email'),要了解有关定义文件字段和处理上传的更多信息,要了解更多信息, 请查看 文件字段.
use Laravel\Nova\Fields\File;
File::make('Attachment'),Gravatar 字段不对应于应用程序数据库的任何一种列类型。相反,它可以显示与模型关联的「Gravatar」头像。
默认地,Gravatar URL 基于模型的 email 列生成。但是,如果用户的邮箱地址不存储在 email 列,你可以给字段的 make 方法传递一个自定义列名:
use Laravel\Nova\Fields\Gravatar;
// 使用「email」列...
Gravatar::make(),
// 用「email_address」列...
Gravatar::make('Avatar', 'email_address'),你可以使用 squared 方法来显示带有方形边缘的图像缩略图。此外,你可以使用 rounded 方法来显示具有完全圆角边缘的图像:
Gravatar::make('Avatar', 'email_address')->squared(),Heading 字段与应用程序数据库中的任何列都不对应。它用于在表单中显示横幅,并可作为字段长列表的分隔符:

use Laravel\Nova\Fields\Heading;
Heading::make('Meta'),如果需要在 Heading 字段中呈现 HTML 内容,则可以在定义字段时调用 asHtml 方法:
Heading::make('<p class="text-danger">* All fields are required.</p>')->asHtml(),标题和列表页
Heading 字段将自动在列表页中隐藏。
Hidden 字段可用于传递用户不需要更改但保存资源所需的任何值:
Hidden::make('Slug'),
Hidden::make('Slug')->default(Str::random(64)),与 默认值 相结合,Hidden 字段可用于将相关 ID 等信息传递到表单:
Hidden::make('User', 'user_id')->default(function ($request) {
return $request->user()->id;
}),ID 表示资源的数据库表主键。通常你定义的每个 Nova 资源都应该包含 ID字段。默认情况下,ID 字段假定基础数据库列名为 id;但是,如果需要,可以将列名作为第二个参数传递给 make 方法:
use Laravel\Nova\Fields\ID;
ID::make(),
ID::make('ID', 'id_column'),如果你的应用程序包含非常大的整数 ID,您可能需要使用 asBigInt 方法,以便 Nova 客户端正确呈现整数:
ID::make()->asBigInt(),ID 字段
每个资源只能配置一个 ID 字段。
Image 字段继承于 File 文件字段 ,接受相同的参数和配置。与 File 字段的区别在于, Image 字段将在查看资源时显示基础图像的缩列图预览:
use Laravel\Nova\Fields\Image;
Image::make('Photo'),默认情况下,Image 字段允许用户下载链接的文件。要禁用下载,可以在字段定义中使用 disableDownload 方法:
Image::make('Photo')->disableDownload(),你可以使用 squared 方法来显示带有方形边缘的图像缩略图。此外,你可以使用 rounded 方法来显示具有完全圆角边缘的缩略图。
File 文件字段
要了解有关定义文件字段和处理上传的更多信息,要了解更多信息, 请查看 文件字段.
KeyValue 字段提供了一个方便的界面,用于编辑存储在 JSON 列类型中的一维键值数据。例如,你可以将配置文件信息存储在名为meta 的 JSON 列类型 中:
use Laravel\Nova\Fields\KeyValue;
KeyValue::make('Meta')->rules('json'),鉴于上述字段定义,Nova 将呈现以下界面:

通过在定义字段时调用 keyLabel, valueLabel, 和 actionText 方法,可以自定义组件中使用的文本值。actionText 方法可自定义 「添加行」按钮文本:
KeyValue::make('Meta')
->keyLabel('Item')
->valueLabel('Label')
->actionText('Add Item'),KeyValue 键值对象字段和列表页
默认情况下,Nova 永远不会在资源索引列表上显示 KeyValue 字段。
如果要禁用用户编辑字段键的功能,可以使用 disableEditingKeys 方法来完成此操作。使用 disableEditingKeys 方法禁用编辑键也将自动禁用添加行:
KeyValue::make('Meta')->disableEditingKeys(),你还可以通过将 disableAddingRows 方法链接到字段的定义上来删除用户向字段添加新行的能力:
KeyValue::make('Meta')->disableAddingRows(),此外,你可能还希望删除用户删除字段中现有行的功能。你可以通过在定义字段时调用 disableDeletingRows 方法来实现这一点:
KeyValue::make('Meta')->disableDeletingRows(),Markdown 字段为其底层 Eloquent 属性提供所见即所得的 Markdown 编辑器。通常,此字段将对应于数据库中的 TEXT 类型的列。Markdown 字段将在相关数据库列中存储原始 Markdown 文本:
use Laravel\Nova\Fields\Markdown;
Markdown::make('Biography'),默认情况下,在查看资源的详细信息页面时,Markdown 字段不会显示其内容。相反,内容将隐藏在「显示内容」链接后面,该链接将在单击时显示字段的内容。你可以通过对字段本身调用 alwaysShow 方法来指定 Markdown 字段应始终显示其内容:
Markdown::make('Biography')->alwaysShow(),Markdown 字段使用 league/commonmark 包来解析 Markdown 内容。默认情况下,它使用类似于 GitHub Flavored Markdown 的解析策略,不允许在 Markdown 内容中使用某些 HTML。但是,你可以使用 preset 方法更改解析策略。目前,以下内置预设为 default, commonmark, 和 zero:
Markdown::make('Biography')->preset('commonmark'),使用 preset 方法,你可以注册并使用自定义预设实现:
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 字段中,可以将 withFiles 方法链接到字段的定义中。调用 withFiles 方法时,应传递图片应存储在的 文件磁盘)的名称:
use Laravel\Nova\Fields\Markdown;
Markdown::make('Biography')->withFiles('public'),Nova 将定义两个数据库表来存储挂起的和持久的 Field 上传。在安装期间运行 Nova 的迁移时,将自动创建这两个表:nova_pending_field_attachments 和 nova_field_attachments。
最后,在 app/Console/Kernel.php 文件中,你应该注册一个 每日计划任务,以从挂起的附件表和存储中删除任何过期的附件。为了方便起见,Laravel Nova 提供了实现这一目标所需的工作实施:
use Laravel\Nova\Fields\Attachments\PruneStaleAttachments;
$schedule->call(new PruneStaleAttachments)->daily();MultiSelect 字段提供了一个 Select 字段,允许选择多个选项。该字段与转换为 array 或等效的模型属性很好地配对:
use Laravel\Nova\Fields\MultiSelect;
MultiSelect::make('Sizes')->options([
'S' => 'Small',
'M' => 'Medium',
'L' => 'Large',
]),在资源索引和详细信息页面上,将显示 MultiSelect 字段的「键」值。如果你想显示标签值,可以在定义字段时调用 displayUsingLabels 方法:
MultiSelect::make('Size')->options([
'S' => 'Small',
'M' => 'Medium',
'L' => 'Large',
])->displayUsingLabels(),你还可以通过提供包含键和 label / group 对的数组结构来显示成组的多选选项:
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 字段提供了一个 input 控件,其 type 属性值为 number:
use Laravel\Nova\Fields\Number;
Number::make('price'),你可以在生成的 input 控件上,使用 min, max, 和 step 方法设置相应属性:
Number::make('price')->min(1)->max(1000)->step(0.01),你还可以允许使用任意精度的十进制值:
Number::make('price')->min(1)->max(1000)->step('any'),Password 字段提供了一个 input 控件,其 type 属性值为 password:
use Laravel\Nova\Fields\Password;
Password::make('Password'),当输入密码为空时,Password 字段会自动保留存储在数据库中的密码。因此,典型的密码字段定义看起来就像下面这样:
use Illuminate\Validation\Rules;
Password::make('Password')
->onlyOnForms()
->creationRules('required', Rules\Password::defaults())
->updateRules('nullable', Rules\Password::defaults()),PasswordConfirmation 字段提供可用于确认另一个 Password 字段的输入。该字段仅显示在表单上,不会试图在 Eloquent 模型上对基础属性进行赋值:
PasswordConfirmation::make('Password Confirmation'),使用此字段时,应在相应的 Password 字段上定义适当的验证规则:
Password::make('Password')
->onlyOnForms()
->creationRules('required', Rules\Password::defaults(), 'confirmed')
->updateRules('nullable', Rules\Password::defaults(), 'confirmed'),
PasswordConfirmation::make('Password Confirmation'),Select 字段用于生成下拉选择菜单。可以使用 options 方法定义菜单选项:
use Laravel\Nova\Fields\Select;
Select::make('Size')->options([
'S' => 'Small',
'M' => 'Medium',
'L' => 'Large',
]),在资源的索引和详情界面,将显示 Select 字段的键值。 如果你想要显示标签,可以使用 displayUsingLabels 方法:
Select::make('Size')->options([
'S' => 'Small',
'M' => 'Medium',
'L' => 'Large',
])->displayUsingLabels(),你还可以通过提供一个包含键和 label / group 对的数组结构来分组显示 Select 选项:
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 方法提供一个闭包:
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 方法来启用此功能:
Select::make('Size')->searchable()->options([
'S' => 'Small',
'M' => 'Medium',
'L' => 'Large',
])->displayUsingLabels(),在将选择字段标记为 searchable 后,Nova 将显示一个 input 字段,允许你根据其标签筛选选项列表:

有时,你可能需要根据另一个字段的内容生成一个唯一的、可读的标识符,例如在为博客文章标题生成「slug」时。你可以使用 Slug 字段自动生成这些「slugs」:
Slug::make('Slug')->from('Title'),默认情况下,该字段会将 'My Blog Post' 之类的字符串转换为 'my-blog-post' 。如果你希望字段使用下划线而不是短划线,则可以使用 separator 方法定义自己的自定义「分隔符」:
Slug::make('Slug')->from('Title')->separator('_'),Sparkline 字段可用于在资源的索引或详细信息页上显示线形图。提供给 Sparkline 的数据可以通过 array、callable(返回数组)或 Trend 度量类的实例提供:
// 使用数组...
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 字段:
Sparkline::make('Post Views')->data(new PostViewsOverTime($this->id)),在上面的例子中,我们将 post 的 id 提供给度量的构造函数。该值将成为趋势度量中可用的请求的 resourceId 属性。例如,在度量中,我们可以通过 $request->resourceId 访问此帖子ID:
return $this->countByDays(
$request,
PostView::where('post_id', '=', $request->resourceId)
);默认范围
当通过趋势度量向 Sparkline 字段提供数据时,Sparkline 字段将始终使用度量的 ranges 方法中定义的第一个范围。
如果条形图更适合你的数据,你可以在定义字段时调用 asBarChart 方法:
Sparkline::make('Post Views')
->data([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
->asBarChart(),默认情况下,Sparkline 将出现在资源的详细信息页面上。你可以使用 height 和 width 方法自定义图表的尺寸:
Sparkline::make('Post Views')
->data([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
->height(200)
->width(600),Status 字段用于显示「进度状态」。Nova 使用 Status 字段指示排队操作的当前状态(等待,运行中,已完成)。 你可以根据具体情况定义这个字段:

loadingWhen 和 failedWhen 方法可用于指示字段哪些字表示 「loading」 状态,哪些字表示为「failed」状态。 例如,我们定义数据库列的 「loading」 指示符为 waiting 或者 running :
use Laravel\Nova\Fields\Status;
Status::make('Status')
->loadingWhen(['waiting', 'running'])
->failedWhen(['failed']),随着资源类的增长,你可能会发现将字段分组在一起以简化索引和详细信息视图非常有用。Stack 字段允许你以垂直方向显示 BelongsTo, Text 等字段:
Stack::make('Details', [
Text::make('Name'),
Text::make('Slug')->resolveUsing(function () {
return Str::slug(optional($this->resource)->name);
}),
]),
Stack 字段在编辑表单不显示,仅用于堆叠索引和详细信息资源视图上的文本行。
为了更好地控制 Stack 中各个字段的显示方式,可以使用 Line 字段,该字段提供了控制行文本显示的方法。Line 字段提供以下表示方法:
asHeadingasSubTitleasSmallasBase
除了 Line 字段的表示方法外,你还可以向该字段传递任何附加的 Tailwind 类,以自定义 Line 的外观:
Stack::make('Details', [
Line::make('Title')->extraClasses('italic font-medium text-80'),
]),除了将 BelongsTo, Text, 和 Line 字段传递到 Stack 字段之外,还可以传递闭包。闭包的结果将自动转换为 Line 实例:
Stack::make('Details', [
Line::make('Name')->asHeading(),
fn () => optional($this->resource)->position
]),Tag 字段允许你使用标记选择界面搜索和附加 BelongsToMany 关系。此字段可用于向用户添加角色、标记文章、为书籍分配作者以及其他类似场景:
use Laravel\Nova\Fields\Tag;
Tag::make('Tags'),
Tag 字段将显示在索引视图的下拉列表中:

你可以通过调用字段上的 withPreview 方法,指示 Tag 字段允许预览关联的标签。这将以模式显示相关资源的预览详细信息:
use Laravel\Nova\Fields\Tag;
Tag::make('Tags')->withPreview(),
你可以将你的标签显示为列表,而不是将标签显示为内联组:
use Laravel\Nova\Fields\Tag;
Tag::make('Tags')->displayAsList(),这允许标签显示其标题、副标题和配置的图像字段:


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

要启用此功能,请在定义字段时调用 showCreateRelationButton 方法:
use Laravel\Nova\Fields\Tag;
Tag::make('Tags')->showCreateRelationButton(),你可以使用 modalSize 方法调整模式的大小:
// 可以使用 "sm", "md", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "7xl".
Tag::make('Tags')->showCreateRelationButton()->modalSize('7xl'),为了使现有标签更容易被发现,你可以在定义字段时调用 preload 方法,在资源创建或更新期间向用户显示所有可用标记:
Tag::make('Tags')->preload(),Text 字段提供了一个 type 属性为 text 的 input 控件:
use Laravel\Nova\Fields\Text;
Text::make('Name'),可以通过设置字段上的任何属性来进一步自定义文本字段。这可以通过调用 withMeta 方法并提供包含 HTML 属性 键/值 对的 extraAttributes 数组来实现:
Text::make('Name')->withMeta([
'extraAttributes' => [
'placeholder' => 'David Hemphill',
],
]),要在键入 Text 字段时提供自动完成建议,你可以在定义字段时调用 suggestions 方法。suggestions 方法应返回建议的数组 array :
Text::make('Name')->required()
->suggestions([
'David Hemphill',
'Taylor Otwell',
'James Brooks',
]),
要将 Text 字段格式化为链接,你可以在定义字段时调用 asHtml 方法:
Text::make('Twitter Profile', function () {
$username = $this->twitterUsername;
return "<a href='https://twitter.com/{$username}'>@{$username}</a>";
})->asHtml(),有时,你可能希望将字段的值复制到系统剪贴板中,以便粘贴到其他位置。通过在 Text 字段上调用 copyable 方法,可以在资源的详细信息视图中启用此功能:
Text::make('Twitter Profile')->copyable(),maxlength 你可能希望向用户指示 Text 字段的内容应保持在一定长度内。你可以通过在字段上使用 maxlength 方法来完成此操作:
use Laravel\Nova\Fields\Text;
Text::make('Name')->maxlength(250),Nova 将显示字段的最大长度以及字符计数器。然而,Nova 不会强制执行最大长度。要指示 Nova 强制执行限制,可以在字段上调用 enforceMaxlength 方法:
use Laravel\Nova\Fields\Text;
Text::make('Name')->maxlength(250)->enforceMaxlength(),Textarea 字段提供一个 textarea 控件:
use Laravel\Nova\Fields\Textarea;
Textarea::make('Biography'),默认情况下,在查看资源的详细信息页面时,文本区域字段不会显示其内容。相反,该字段的内容将隐藏在「显示内容」链接后面,该链接将在单击时显示内容。但是,如果你愿意,可以通过调用字段上的 alwaysShow 方法来指定 Textarea 字段应始终显示其内容:
Textarea::make('Biography')->alwaysShow(),你可以通过调用字段上的 rows 方法来指定 Textarea 高度:
Textarea::make('Excerpt')->rows(3),可以通过设置字段上的任何属性来进一步自定义 Textarea 字段。这可以通过调用 withMeta 方法并提供包含 HTML 属性 键/值 对的 extraAttributes 数组来实现:
Textarea::make('Excerpt')->withMeta(['extraAttributes' => [
'placeholder' => 'Make it less than 50 characters']
]),maxlength 你可能希望向用户指示 Textarea 字段的内容应保持在一定长度内。你可以通过在字段上使用 maxlength 方法来完成此操作:
use Laravel\Nova\Fields\Textarea;
Textarea::make('Name')->maxlength(250),Nova 将显示字段的最大长度以及字符计数器。然而,Nova 不会强制执行最大长度。要指示 Nova 强制执行限制,可以在字段上调用 enforceMaxlength 方法:
use Laravel\Nova\Fields\Textarea;
Textarea::make('Name')->maxlength(250)->enforceMaxlength(),Timezone 时区字段 生成一个包含世界时区的 Select 字段:
use Laravel\Nova\Fields\Timezone;
Timezone::make('Timezone'),Trix 字段为其关联的字段提供一个 Trix 编辑器。通常,这个字段将和你数据库中的 TEXT 列对应。Trix 字段将为其对应的数据列存储对应的 Html:
use Laravel\Nova\Fields\Trix;
Trix::make('Biography'),默认情况下,Trix 字段在其详细信息页面上查看资源时不会显示其内容。相反,内容将隐藏在「显示内容」链接后面,单击该链接时将显示字段的内容。如果你愿意,可以指定 Trix 字段在定义字段时应始终通过调用 alwaysShow 方法来显示其内容:
Trix::make('Biography')->alwaysShow(),如果你想允许用户将图片拖放到 Trix 字段中,可以将 withFiles 方法链接到字段的定义中。调用 withFiles 方法时,应传递图片应存储在的 文件存储磁盘的名称:
use Laravel\Nova\Fields\Trix;
Trix::make('Biography')->withFiles('public'),Nova 将定义两个数据库表来存储挂起的和持久的 Field 上传。在安装期间运行 Nova 的迁移时,将自动创建这两个表:nova_pending_field_attachments 和 nova_field_attachments。
最后,在 app/Console/Kernel.php 文件中,你应该注册一个 每日计划任务,以从挂起的附件表和存储中删除任何过期的附件。为了方便起见,Laravel Nova 提供了实现这一目标所需的工作实施:
use Laravel\Nova\Fields\Attachments\PruneStaleAttachments;
$schedule->call(new PruneStaleAttachments)->daily();UiAvatar 字段与应用程序数据库中的任何列都不对应。相反,此字段将生成一个包含用户首字母缩写的简单头像。该字段由 ui-avatars.com 提供支持。
默认情况下,将根据模型的 name 列的值生成 UiAvatar 图像。但是,如果用户名未存储在 name 列中,则可以将自定义列名传递给字段的 make 方法:
use Laravel\Nova\Fields\UiAvatar;
// 使用 "name" 列...
UiAvatar::make(),
// 使用自定义列...
UiAvatar::make('Avatar', 'full_name'),如有必要,你可以调用 resolveUsing 方法来指定应调用的闭包,以确定应用于生成化身的名称:
UiAvatar::make()->resolveUsing(function () {
return implode(' ', explode('@', $this->email));
}),你可以使用 squared 方法来显示带有方形边缘的图像缩略图。此外,你可以使用 rounded 方法来显示具有完全圆角边缘的图像:
UiAvatar::make('Avatar', 'fullname')->squared(),定义 UiAvatar 字段时可用的其他选项包括:
| Option | Method | Description |
|---|---|---|
| 文字大小 | fontSize(0.4) | 将字体大小设置为介于从 0.1 到 1. |
| 加粗 | bold() | 将字体设置为粗体. |
| 背景颜色 | backgroundColor('1D4ED7') | 设置图像背景的十六进制颜色. |
| 文本颜色 | color('FFFFFF') | 设置图像文本的十六进制颜色. |
URL 字段将 URL 呈现为可单击的链接,而不是纯文本:
URL::make('GitHub URL'),URL 字段还支持通过在定义字段时调用 displayUsing 方法来自定义生成的链接的文本。 displayUsing 方法接受一个闭包,该闭包应返回链接的文本:
URL::make('Receipt')
->displayUsing(fn () => "{optional($this->user)->name}'s receipt")通过提供闭包作为 URL 字段的第二个参数,你可以使用该字段来呈现计算值的链接,该值不一定与关联模型的数据库表中的列相对应:
URL::make('Receipt', fn () => $this->receipt_url)Vapor 文件字段在使用 Laravel Vapor 将应用程序部署到无服务器环境时为上传文件提供了便利和兼容性:
use Laravel\Nova\Fields\VaporFile;
VaporFile::make('Document'),当使用 VaporFile 字段上传文件时,Nova 将首先在 Amazon S3 上生成一个签名存储 URL。接下来,Nova 将直接将文件上传到 Amazon S3 存储桶中的临时存储中。保存资源后,Nova 会将文件移动到永久存储中。
Vapor 存储
有关如何为 Vapor 应用程序处理文件存储的更多信息, 请查看 Laravel Vapor storage documentation.
Vapor文件字段在无服务器环境中使用 Laravel Vapor 部署应用程序时,为上传图像文件提供了便利和兼容性:
use Laravel\Nova\Fields\VaporImage;
VaporImage::make('Avatar'),Vapor image 字段继承于 Image ,接受相同的参数和配置。
文件字段
了解有关定义文件字段和处理上传的详细信息, 请查看文档 file field documentation.
为了验证 Vapor 文件的大小或其他属性,你需要直接通过Storage 门面检查文件:
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 方法来创建这些字段:
Text::make('Name', function () {
return $this->first_name.' '.$this->last_name;
}),模型实例将传递给可调用的计算字段,允许你在计算字段值时访问模型的属性:
Text::make('Name', function ($model) {
return $model->first_name.' '.$model->last_name;
}),模型属性访问
正如你在上面的示例中可能注意到的那样,你也可以使用 $this 来访问资源的底层模型属性和关系。
默认情况下,Vue 将转义计算字段的内容。如果需要在字段中呈现 HTML 内容,请在定义字段时调用 asHtml 方法:
Text::make('Status', function () {
return view('partials.status', [
'isPassing' => $this->isPassing(),
])->render();
})->asHtml(),有时,你可能希望允许用户只创建和更新资源上的某些字段。你可以通过调用字段上的 readonly 方法将字段标记为「只读」,这将禁用字段的相应输入。你可以将布尔参数传递给 readonly 法,以动态控制字段是否应为「只读」:
Text::make('Email')->readonly(optional($this->resource)->trashed()),你也可以将闭包传递给 readonly 方法,闭包的结果将用于确定字段是否应为「只读」。闭包将接收当前的 NovaRequest 作为其第一个参数:
Text::make('Email')->readonly(function ($request) {
return ! $request->user()->isAdmin();
}),如果在创建或附加资源时只想将字段标记为「只读」,则可以分别使用 NovaRequest 实例提供的 isCreateOrAttachRequest 和 isUpdateOrUpdateAttachedRequest 方法:
Text::make('Email')->readonly(function ($request) {
return $request->isUpdateOrUpdateAttachedRequest();
}),默认情况下,Nova 将使用红色星号表示必填字段:

Nova 通过在字段的验证规则中查找 required 规则来确定它是否应该显示所需状态。例如,具有以下定义的字段将收到一个 「必需」 指示符:
Text::make('Email')->rules('required'),当你有复杂的 required 验证要求时,你可以在定义字段时通过向 required 方法传递布尔值来手动将字段标记为必需。这将通知 Nova,UI 中应显示「必需」指示符:
Text::make('Email')->required(true),此外,你还可以将闭包传递给 required 方法,以确定字段是否应标记为「必需」。闭包将收到一个 NovaRequest 实例。闭包返回的值将用于确定是否需要字段:
use Illuminate\Validation\Rule;
Text::make('Email')->required(function ($request) {
return $this->notify_via_email;
}),required() 局限性
required() 方法只会在 Nova UI中添加一个「必需」指示符。你仍然必须定义应在验证期间应用的相关需求规则 rules() 。
默认情况下,Nova 会尝试用一个值存储所有字段,但是,有时当字段为空时,你可能更希望 Nova 在相应的数据库列中存储 null 值。为此,你可以在字段定义中调用 nullable 方法:
Text::make('Position')->nullable(),你还可以使用 nullValues 方法设置哪些值应被解释为 null 值,该方法接受数组或闭包作为其唯一参数:
Text::make('Position')->nullable()->nullValues(['', '0', 'null']),
Text::make('Position')->nullable()->nullValues(function ($value) {
return $value == '' || $value == 'null' || (int)$value === 0;
}),如果你想将帮助提示文本放在字段下面,则可以在定义字段时调用 help 方法:
Text::make('Tax Rate')->help(
'The tax rate to be applied to the sale'
),如有必要,你可以在字段的帮助文本中包含 HTML,以进一步自定义帮助文本:
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 方法堆叠在其标签下方:
Trix::make('Content')->stacked(),你可以使用 fullWidth 方法指示字段应为全屏宽度:
Trix::make('Content')->fullWidth(),你可以使用 textAlign 方法更改字段的文本对齐方式:
Text::make('Phone Number')->textAlign('left'),支持以下参数:
leftcenterrightresolveUsing 方法允许你自定义字段在从数据库中检索之后但在发送到 Nova 前端之前的格式化方式。此方法接受一个回调,该回调接收基础数据库列的原始值:
Text::make('Name')->resolveUsing(function ($name) {
return strtoupper($name);
}),如果你想自定义字段只有在资源的「索引」或「详细信息」页上显示时的格式,可以使用 displayUsing 方法。与 resolveUsing 方法一样,此方法接受单个回调:
Text::make('Name')->displayUsing(function ($name) {
return strtoupper($name);
}),filterable 方法允许你为给定的资源、关系和镜头字段启用方便、自动的 搜索)功能。Nova 生成的过滤器将通过资源索引上的资源过滤器菜单自动提供:
DateTime::make('Created At')->filterable(),
filterable 方法也接受闭包作为参数。此闭包将接收筛选查询,然后你可以自定义该查询,以便根据自己的喜好筛选资源结果:
Text::make('Email')->filterable(function ($request, $query, $value, $attribute) {
$query->where($attribute, 'LIKE', "{$value}%");
}),根据标记为可筛选的基础字段类型,生成的筛选器将是文本筛选器、选择筛选器、数字范围筛选器或日期范围筛选器。
dependsOn 方法允许你指定字段的配置取决于一个或多个其他字段的值。dependsOn 方法接受依赖字段属性的数组 array 和修改当前字段实例配置的闭包。
依赖字段允许高级自定义,例如根据另一个字段的状态切换只读模式、验证规则等:
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']);
}
}
),要分别定义用于创建和更新资源的依赖字段,可以使用 dependsOnCreating 和 dependsOnUpdating 方法。
以下字段类型可依赖其他字段:
以下字段类型可能不受其他字段的依赖,因为它们不会向 Nova 实时报告其更改:
dependsOn 切换字段可见性 依赖字段的一个常见用例是基于另一个字段的值来切换字段可见性。你可以使用 hide 和 show 方法来完成此操作:
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 方法来完成此操作:
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));
}),当与依赖字段交互时,你可以通过 resource 方法检索当前资源和相关资源ID:
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 类添加其他方法。Field 类 macro 方法接受一个闭包,该闭包将在调用宏时执行。宏闭包可以通过 $this 访问字段的其他方法,就像它是字段类的真实方法一样。例如,以下代码将 toUpper 方法添加到 Field 类中:
use Illuminate\Support\Str;
use Laravel\Nova\Fields\Field;
Field::macro('toUpper', function () {
return $this->displayUsing(function ($value) {
return Str::upper($value);
});
});一旦定义了宏,就可以在定义任何字段时使用它:
Text::make('Name')->toUpper(),如有必要,可以定义接受其他参数的宏:
use Laravel\Nova\Fields\Field;
Field::macro('showWhen', function ($condition) {
$condition === true ? $this->show() : $this->hide();
return $this;
});你也可以仅将宏添加到特定类型的 Field 中。例如,你可以将 withFriendlyDate 宏添加到 DateTime 字段类中:
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();
});
});
});