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

时间:2018-09-18 15:03:30

标签: laravel laravel-nova

我正在使用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的创建功能?我该如何实现?

  

我可以使用资源事件,但是如何在以下位置检索登录的用户   活动吗?

5 个答案:

答案 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