Laravel nova 资源 extending/overriding 创建方法

Laravel nova resource extending/overriding the create method

我正在使用 Laravel Nova 开发网络管理面板。

我遇到了一个问题,因为 Nova 是一项新技术。

我现在想做的是添加一个隐藏字段或者扩展或重写创建方法。

这是我的场景。让我们保存我有一个 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 的创建功能?我怎样才能实现它?

I can use resource event, but how can I retrieve the logged in user in the event?

您要找的是 Resource Events

来自文档:

All Nova operations use the typical save, delete, forceDelete, restore Eloquent methods you are familiar with. Therefore, it is easy to listen for model events triggered by Nova and react to them. The easiest approach is to simply attach a model observer to a model:

如果您不想创建一个新的可观察对象,您也可以在 eloquent 模型中创建一个 boot 方法,如下所示:

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

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

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

在我看来你应该选择 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
])

您也可以直接在 Nova 资源中执行此操作。每个 Nova 资源都有 newModel() 方法,当资源从数据库加载模型的新实例时调用该方法。您可以覆盖它并在其中放置用于设置任何默认值的逻辑(您应该始终检查值是否已经存在,并且仅在它们为 null 时设置,只有在第一次创建模型时才会出现这种情况,这是你真正需要的):

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

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

    return $instance;
}

a) 使用以下命令创建观察者 class:

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

从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