Nova 4 延续了 Nova 3.x 的改进,引入了基于 Tailwind 2、Vue 3 和 Inertia.js 的全面更新的响应式设计。别担心,它支持黑暗模式。
此外,Nova 4 还引入了对可折叠关系、自定义品牌、通知、操作回调、新字段、依赖字段、可筛选字段、自定义菜单、新指标、批处理操作、搜索改进等的支持。
Nova 4 推出了一个彻底刷新的用户界面,现在可以完全响应,因此您可以随时随地管理数据:

而且,根据流行趋势,Nova 界面现在支持 "暗黑模式":

nova 配置文件中添加了一个新的 brand 配置选项,使您可以轻松自定义 Nova 界面中使用的 "主要颜色" 和徽标,而无需创建自定义 Nova 主题:

要了解更多信息,请查看 自定义品牌文档 。
Nova 4 允许你折叠给定资源类型的关联,以便在查看关联时默认情况下不再加载这些关联。Nova 会将你折叠的关联存储在浏览器的本地存储中,以便 Nova 能够记住你的偏好。我们认为你会发现,当查看具有数十种关系的资源类型时,可折叠关联会显著提高性能:

新的 Action::then 方法允许你在对所有选定资源执行完动作后轻松执行代码。此功能允许你在动作执行完毕后轻松生成报告或发送通知:
/**
* 获取资源可用的操作.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function actions(NovaRequest $request)
{
return [
(new Actions\EmailAccountProfile)->then(function ($models) {
$models->each(function ($model) {
//
});
}),
];
}动作现在可以利用 Laravel 的 任务批处理 功能,提供注册批处理回调的能力,该回调在整个动作批执行完毕后执行额外任务:
use Illuminate\Bus\Batch;
use Throwable;
/**
* 准备执行批处理任务.
*
* @param \Laravel\Nova\Fields\ActionFields $fields
* @param \Illuminate\Bus\PendingBatch $batch
* @return void
*/
public function withBatch(ActionFields $fields, PendingBatch $batch)
{
$batch->then(function (Batch $batch) {
// 所有任务已成功完成...
$selectedModels = $batch->resourceIds;
})->catch(function (Batch $batch, Throwable $e) {
// 检测到第一批任务失败...
})->finally(function (Batch $batch) {
// 批处理已完成执行...
});
}了解有关批处理动作的更多信息, 请查看 动作批处理文档.
Nova 4引入了几种新的字段类型,包括 Color, UiAvatar, MultiSelect, 和 URL. 有关使用这些字段的详细信息, 请查看 字段文档.

Nova 4 还引入了对 dependsOn 字段的支持。新的 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']);
}
}
),要了解更多信息, 请查看 依赖字段文档.
Nova 4 引入了一种新的 filterable 方法,允许你在不创建自定义过滤器的情况下,为给定的资源、关系和镜头字段启用方便、自动的 过滤器)功能。Nova 生成的过滤器将通过资源索引上的资源过滤器菜单自动提供:
DateTime::make('Created At')->filterable(),
要了解更多信息, 请查看 可筛选字段文档.
Nova 4 还引入了对 "Nova 通知" 的支持,这是 Nova 中一个全新的通知菜单,你可以使用它为 Nova 用户显示信息。例如,你可以使用此菜单通知用户已生成报告或发票需要注意:

要发送 Nova 通知,只需将 NovaNotification 实例传递给可通知用户:
use Laravel\Nova\Notifications\NovaNotification;
$request->user()->notify(
NovaNotification::make()
->message('Your report is ready to download.')
->action('Download', 'https://example.com/report.pdf')
->icon('download')
->type('info')
);要了解有关Nova通知的更多信息, 请查看 通知文档.
将应用程序部署到生产环境后,您可能偶尔需要 "模拟" 应用程序的另一个用户,以便调试客户报告的问题。值得庆幸的是,Nova 现在包含了内置功能来处理这种确切的场景。
要启用用户模拟,请将 Laravel\Nova\Auth\Impersonatable 特性添加到应用程序的 User 模型中:
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Impersonatable, Notifiable;
// ...
}一旦将 Impersonatable 特性添加到应用程序的 User 模型中,将通过相应资源的内联操作菜单提供 "模拟" 操作:

此外,Nova 现在支持完全自定义的侧栏和用户菜单。事实上,你可以完全自定义 Nova 左侧导航栏中的每个链接条目,包括创建菜单部分、菜单组等:

了解有关构建自己的自定义菜单的更多信息, 请查看 自定义菜单文档.
新的 "进度" 指标允许你跟踪你在实现给定目标方面的进度。例如,你可能希望根据目标目标跟踪当月的新用户注册情况。使用新的进度指标很容易:

了解有关构建和定义指标的更多信息, 请查看 指标文档.
有时,你可能希望创建一个新资源,同时使用现有资源中的所有数据作为起点。Nova 的新资源复制功能正是这样做的。单击复制按钮后,你将被带到一个资源创建表单,其中已复制资源的所有数据都已提交到该表单中,并准备进行调整:

全新的资源预览模式可以让你在不离开资源索引页面的情况下预览资源的数据,提供了一种在不中断流程的情况下了解更多资源信息的好方法:

了解有关将字段添加到资源预览模式的详细信息, 请查看 字段文档.
HasOne 关联字段现在可以使用 ofMany 方法转换为 "has one of many" Eloquent 关系。例如,让我们假设一个 User 模型 hasMany Post模型。我们可以将 "has one of many" 关系添加到我们的 User Nova资源中,如下所示:
use App\Nova\Post;
use Laravel\Nova\Fields\HasOne;
HasOne::ofMany('Latest Post', 'latestPost', Post::class),当然, "morph one of many" 关联还支持:
use App\Nova\Comment;
use Laravel\Nova\Fields\MorphOne;
MorphOne::ofMany('Latest Comment', 'latestComment', Comment::class),具有 HasOne 关系的资源现在可以直接在父资源的创建表单中创建这些关联的数据。这种新功能使在一个方便的操作中创建父资源及其子资源变得轻而易举:

通常,Nova 使用简单的 LIKE 子句搜索数据库列。但是,如果你使用 MySQL 或 Postgres,你现在可以利用您定义的任何全文索引:
use Laravel\Nova\Query\Search\SearchableText;
/**
* 获取资源的可搜索列.
*
* @return array
*/
public static function searchableColumns()
{
return ['id', new SearchableText('title')];
}此外,Nova 4 甚至允许你在资源的关联和 JSON 列中进行搜索
use Laravel\Nova\Query\Search\SearchableJson;
use Laravel\Nova\Query\Search\SearchableRelation;
public static function searchableColumns()
{
return [
'id',
new SearchableRelation('author', 'name')
new SearchableJson('meta->tag')
];
}了解有关 Nova 搜索功能的更多信息,请查看 综合搜索文档.