Laravel Nova 是一款 Laravel 應(yīng)用程序的后臺管理面板。當(dāng)然,Nova 的主要功能是使用 Eloquent 管理底層數(shù)據(jù)庫記錄。Nova 通過在應(yīng)用中定義一個(gè)與 Eloquent 模型對應(yīng)的 Nova「資源」實(shí)現(xiàn)此目標(biāo)。
Nova 資源默認(rèn)存儲在應(yīng)用的 app/Nova
文件夾。你可以使用 nova:resource
Artisan 命令生成一個(gè)新資源:
php artisan nova:resource Post
資源的基本屬性是 model
屬性。此屬性告訴 Nova 該資源對應(yīng)的 Eloquent 模型:
/**
* 資源對應(yīng)的模型。
*
* @var string
*/
public static $model = 'App\Post';
新創(chuàng)建的 Nova 資源只包含一個(gè) ID
字段定義。別擔(dān)心,我們很快會為我們的資源添加更多字段。
自動注冊
默認(rèn)地,
app/Nova
目錄的所有資源由 Nova 自動注冊。你無需手動注冊它們。
資源在 Nova 管理面板中使用之前,必須先由 Nova 注冊。資源一般在 app/Providers/NovaServiceProvider.php
文件里注冊。該文件包含與 Nova 安裝相關(guān)的各種配置和引導(dǎo)代碼。
如上所述,你無需手動注冊資源;但是,如果你選擇手動注冊,可以通過覆蓋 NovaServiceProvider
的 resources
方法實(shí)現(xiàn) 。
手動注冊資源有兩種方法??梢允褂?nbsp;resourcesIn
方法指示 Nova 注冊給定目錄中所有的 Nova 資源。或者,也可以使用 resources
方法手動注冊單個(gè)(或幾個(gè))資源:
use App\Nova\User;
use App\Nova\Post;
/**
* 注冊應(yīng)用程序的 Nova 資源。
*
* @return void
*/
protected function resources()
{
Nova::resourcesIn(app_path('Nova'));
Nova::resources([
User::class,
Post::class,
]);
}
一旦你的資源用 Nova 注冊完畢,它們將在 Nova 面板的側(cè)欄中可用:
如果你經(jīng)常需要在字段、資源標(biāo)題 / 副標(biāo)題 中訪問資源關(guān)聯(lián),那么將此關(guān)聯(lián)添加到資源的 with
屬性里可能是個(gè)好主意。此屬性指示 Nova 在檢索資源時(shí)總是預(yù)加載列出的關(guān)聯(lián)。
例如,如果你在一個(gè) Post
資源的 subtitle
方法里訪問此資源的 user
關(guān)聯(lián),你應(yīng)該將 user
關(guān)聯(lián)添加到 Post
資源的 with
屬性里:
/**
* 在查詢時(shí)應(yīng)預(yù)加載的關(guān)聯(lián)。
*
* @var array
*/
public static $with = ['user'];
所有 Nova 操作都使用了你熟悉的 save
、delete
、forceDelete
、restore
Eloquent 方法。因此,監(jiān)聽 Nova 觸發(fā)的模型事件并作出響應(yīng)非常容易。最簡單的辦法是直接給模型綁定一個(gè) 觀察者 。
<?php
namespace App\Providers;
use App\User;
use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* 啟動所有應(yīng)用服務(wù)。
*
* @return void
*/
public function boot()
{
User::observe(UserObserver::class);
}
/**
* 注冊此服務(wù)提供者。
*
* @return void
*/
public function register()
{
//
}
}
如果只想在 Nova 相關(guān)的 HTTP 請求期間綁定觀察者,你可以在應(yīng)用的 NovaServiceProvider
服務(wù)提供者里注冊一個(gè) Nova::serving
事件監(jiān)聽:
use App\User;
use Laravel\Nova\Nova;
use App\Observers\UserObserver;
/**
* 啟動所有服務(wù)。
*
* @return void
*/
public function boot()
{
parent::boot();
Nova::serving(function () {
User::observe(UserObserver::class);
});
}
更多建議: