Laravel Nova 基础

2023-02-16 17:07 更新

Laravel Nova 是一款 Laravel 应用程序的后台管理面板。当然,Nova 的主要功能是使用 Eloquent 管理底层数据库记录。Nova 通过在应用中定义一个与 Eloquent 模型对应的 Nova「资源」实现此目标。

定义资源

Nova 资源默认存储在应用的 app/Nova 文件夹。你可以使用 nova:resourceArtisan 命令生成一个新资源:

php artisan nova:resource Post

资源的基本属性是 model 属性。此属性告诉 Nova 该资源对应的 Eloquent 模型:

/**
 * 资源对应的模型。
 *
 * @var string
 */
public static $model = 'App\Post';

新创建的 Nova 资源只包含一个 ID 字段定义。别担心,我们很快会为我们的资源添加更多字段。

注册资源

自动注册

默认地,app/Nova 目录的所有资源由 Nova 自动注册。你无需手动注册它们。

资源在 Nova 管理面板中使用之前,必须先由 Nova 注册。资源一般在 app/Providers/NovaServiceProvider.php 文件里注册。该文件包含与 Nova 安装相关的各种配置和引导代码。

如上所述,你无需手动注册资源;但是,如果你选择手动注册,可以通过覆盖 NovaServiceProvider 的 resources 方法实现 。

手动注册资源有两种方法。可以使用 resourcesIn 方法指示 Nova 注册给定目录中所有的 Nova 资源。或者,也可以使用 resources 方法手动注册单个(或几个)资源:

use App\Nova\User;
use App\Nova\Post;

/**
 * 注册应用程序的 Nova 资源。
 *
 * @return void
 */
protected function resources()
{
    Nova::resourcesIn(app_path('Nova'));

    Nova::resources([
        User::class,
        Post::class,
    ]);
}

一旦你的资源用 Nova 注册完毕,它们将在 Nova 面板的侧栏中可用:


预加载

如果你经常需要在字段、资源标题 / 副标题 中访问资源关联,那么将此关联添加到资源的 with 属性里可能是个好主意。此属性指示 Nova 在检索资源时总是预加载列出的关联。

例如,如果你在一个 Post 资源的 subtitle 方法里访问此资源的 user 关联,你应该将 user 关联添加到 Post 资源的 with 属性里:

/**
 * 在查询时应预加载的关联。
 *
 * @var array
 */
public static $with = ['user'];

资源事件

所有 Nova 操作都使用了你熟悉的 savedeleteforceDeleterestoreEloquent 方法。因此,监听 Nova 触发的模型事件并作出响应非常容易。最简单的办法是直接给模型绑定一个 观察者 。

<?php

namespace App\Providers;

use App\User;
use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * 启动所有应用服务。
     *
     * @return void
     */
    public function boot()
    {
        User::observe(UserObserver::class);
    }

    /**
     * 注册此服务提供者。
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

如果只想在 Nova 相关的 HTTP 请求期间绑定观察者,你可以在应用的 NovaServiceProvider 服务提供者里注册一个 Nova::serving 事件监听:

use App\User;
use Laravel\Nova\Nova;
use App\Observers\UserObserver;

/**
 * 启动所有服务。
 *
 * @return void
 */
public function boot()
{
    parent::boot();

    Nova::serving(function () {
        User::observe(UserObserver::class);
    });
}


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号