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

问题描述 投票:1回答:3

我正在使用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的创建功能?我怎样才能实现它?

我可以使用资源事件,但是如何在事件中检索登录用户?

laravel laravel-nova
3个回答
10
投票

你要找的是Resource Events

来自文档:

所有Nova操作都使用您熟悉的典型save,delete,forceDelete,Restore Eloquent方法。因此,很容易听到Nova触发的模型事件并对它们做出反应。最简单的方法是简单地将模型观察者附加到模型:

如果你不想创建一个新的observable,你也可以在你雄辩的模型中创建一个boot方法,如下所示:

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

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

但是请注意,这些比观察者更难以跟踪,并且您或未来的下一个开发人员可能会摸不着头脑,想知道“created_at”属性集是如何设置的。


3
投票

在我看来你应该去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;

    }

要么

你可以简单地用一个meta来破解Nova字段。

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

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.