Ресурс Laravel nova, расширяющий / переопределяющий метод create - PullRequest
0 голосов
/ 18 сентября 2018

Я занимаюсь разработкой панели веб-администрирования, используя 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?Как мне этого добиться?

Я могу использовать ресурсное событие, но как я могу получить зарегистрированного пользователя в этом событии?

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

На мой взгляд, вы должны пойти на 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;

    }

ИЛИ

Вы можете просто взломать поле Nova с мета.

Text::make('created_by')->withMeta(['type' => 'hidden', 'value' => Auth::user()->id])
0 голосов
/ 18 марта 2019

Вы также можете сделать это прямо в вашем ресурсе 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;
}
0 голосов
/ 21 октября 2018

То, что вы ищете, это Resource Events .

Из документов:

Все операции Nova используют обычные методы сохранения, удаления, принудительного удаления, восстановления, которые вам знакомы.Поэтому легко прослушивать модельные события, запускаемые Nova, и реагировать на них.Самый простой подход - просто прикрепить наблюдателя модели к модели:

Если вы не хотите создавать новую наблюдаемую модель, вы также можете создать метод boot в своей красноречивой модели следующим образом:

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

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

Но, пожалуйста, обратите внимание, что их немного сложнее отследить, чем наблюдаемые, и вы или следующий разработчик в будущем, возможно, почесываете голову, задаваясь вопросом, как устанавливается свойство "create_at".

...