我正在使用Laravel Nova开发一个Web管理面板。
由于Nova是一项相当新的技术,所以我遇到了一个问题。
我现在想做的是添加一个隐藏字段或扩展或覆盖create方法。
这是我的情况。让我们保存一下,我有一个vacancy
nova资源,其中包含以下字段。
public function fields(Request $request)
{
return [
ID::make()->sortable(),
Text::make('Title')->sortable(),
Text::make('Salary')->sortable()
// I will have another field, called created_by
];
}
非常简单。我想做的是要向数据库中添加一个名为created_by
的新字段。然后,该字段将被当前登录的用户id
($request->user()->id
)自动填充。
如何覆盖或扩展Nova的创建功能?我该如何实现?
我可以使用资源事件,但是如何在以下位置检索登录的用户 活动吗?
答案 0 :(得分:3)
您要寻找的是Resource Events。
从文档中
所有Nova操作都使用您熟悉的典型的save,delete,forceDelete和Restore Eloquent方法。因此,很容易监听Nova触发的模型事件并对它们做出反应。 最简单的方法是将模型观察者简单地附加到模型上:
如果您不想创建一个新的可观察对象,也可以在雄辩的模型中创建一个boot
方法,如下所示:
public static function boot()
{
parent::boot();
static::creating(function ($vacancy) {
$vacancy->created_by = auth()->user()->id;
});
}
但是请注意,这些对象比可观察对象要难跟踪一些,您或未来的下一个开发人员可能会scratch不休,想知道“ created_at”属性的设置如何。
答案 1 :(得分:1)
我认为您应该参加Observers
。观察者将使您的代码更具可读性和可追踪性。
这是使用Laravel Observers可以实现相同目标的方法。
AppServiceProver.php
public function boot()
{
Nova::serving(function () {
Post::observe(PostObserver::class);
});
}
PostObserver.php
public function creating(Post $post)
{
$post->created_by = Auth::user()->id;
}
OR
您可以简单地使用元数据来入侵Nova
字段。
Text::make('created_by')->withMeta(['type' => 'hidden', 'value' => Auth::user()->id])
答案 2 :(得分:0)
您也可以直接在Nova资源中执行此操作。每个Nova资源都有newModel()
方法,当资源从db加载模型的新实例时会调用该方法。您可以覆盖它,并放置用于设置任何默认值的逻辑(应始终检查值是否已存在,并且仅在它们为null时才进行设置,这仅在首次创建模型时才会发生,是您真正需要的):
public static function newModel()
{
$model = static::$model;
$instance = new $model;
if ($instance->created_by == null) {
$instance->created_by = auth()->user()->id;
}
return $instance;
}
答案 3 :(得分:0)
a)使用以下命令创建一个Observer类:
php artisan make:observer -m "Post" PostObserver
b)在PostObserver中添加以下代码:
$post->created_by = Auth::user()->id;
c)在AppServiceProvider.php中注册PostObserver
有关详细说明:https://medium.com/vineeth-vijayan/how-to-add-a-new-field-in-laravel-nova-resource-87f79427d38c
答案 4 :(得分:0)
从 Nova v3.0 开始,就有了原生的 Hidden 字段。
用法:
Hidden::make('Created By', 'created_by')
->default(
function ($request) {
return $request->user()->id;
}),
文档:https://nova.laravel.com/docs/3.0/resources/fields.html#hidden-field