Laravel nova资源扩展/覆盖create方法

nwnhqdif  于 2022-12-01  发布在  其他
关注(0)|答案(5)|浏览(213)

我正在使用Laravel Nova开发一个Web管理面板。
我有一个问题,因为新星是一个相当新的技术。
我现在要做的是添加一个隐藏字段,或者扩展或覆盖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的创建功能?如何实现?
我可以使用资源事件,但如何在事件中检索登录的用户?

67up9zun

67up9zun1#

您要查找的是资源事件。
来自文档:
所有Nova操作都使用您所熟悉的典型的save、delete、forceDelete、restore Eloquent方法。因此,很容易监听由Nova触发的模型事件并对它们做出React。最简单的方法是将模型观察器连接到模型上:
如果你不想创建一个新的可观察对象,你也可以在你的雄辩模型中创建一个boot方法,如下所示:

public static function boot()
{
    parent::boot();

    static::creating(function ($vacancy) {
        $vacancy->created_by = auth()->user()->id;
    });
}

但是请注意,这些比可观察性更难跟踪,您或未来的开发人员可能会挠头,想知道“created_at”属性是如何设置的。

y1aodyip

y1aodyip2#

在我看来,你应该选择Observers。观察者会让你的代码更具可读性和可跟踪性。
下面是如何实现相同的Laravel观察员。
AppServiceProvider.php

public function boot()
{
    Nova::serving(function () {
        Post::observe(PostObserver::class);
    });
}

PostObserver.php

public function creating(Post $post)
{
    $post->created_by = Auth::user()->id;   
}


您可以使用withMeta简单地破解Nova字段。

Text::make('created_by')->withMeta([
    'type' => 'hidden',
    'value' => Auth::user()->id
])
ezykj2lf

ezykj2lf3#

你也可以直接在你的Nova资源中完成。每个Nova资源都有newModel()方法,当资源从数据库中加载你的模型的新示例时,它会被调用。你可以覆盖它,并在那里放置你的逻辑来设置任何默认值(您应该始终检查值是否已经存在,并且仅在它们为空时才设置,这仅在第一次创建模型时才会发生,这是您实际需要的):

public static function newModel()
{
    $model = static::$model;
    $instance = new $model;

    if ($instance->created_by == null) {
        $instance->created_by = auth()->user()->id;
    }

    return $instance;
}
kx1ctssn

kx1ctssn4#

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

insrf1ej

insrf1ej5#

自Nova v3.0起,有一个本地隐藏字段。
用法:

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

相关问题