Laravel: Запретить изменение ресурса API после обновления модели - PullRequest
0 голосов
/ 02 апреля 2019

Я реализую журнал событий, происходящих в системе. Другими словами, определите, когда объект создан, и сохраните данные, которые были созданы. Когда приходит обновление, мне нужно сохранить предыдущее состояние объекта и новое. Поскольку я использую ресурсы API с пользовательскими реализациями данных, я повторно использую их для сбора всей необходимой информации.

public function update(Request $request, Attendant $attendant)
{
    $attendantData = $request->input('attendant');

    $prevResource = new AttendantResource($attendant);
    $attendant = AttendantService::Update($attendant, $attendantData);

    $resource = new AttendantResource($attendant);

    $this->createLog($prevResource, $resource);

    return $resource;
}

В предыдущем коде создайте новый ресурс перед изменением помощника. Но в конце, $prevResource и $resource имеют одинаковые данные. Информация из $prevResource является обновлением до О.

Есть ли способ клонировать модель? или вместо этого, есть ли способ предотвратить обновление ссылки с $prevResource?

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

На мой взгляд, это не способ решения проблемы такого типа (в контроллере).

То, что вы на самом деле хотите сделать, - это зарегистрировать прослушиватель событий, который будет вести журнал при обновлении вашей красноречивой модели. Есть и модели "наблюдатели".

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

Вот специальная документация по " Ведение журнала событий модели ."

Приятной особенностью использования Spatie Logger является то, что он проявился как простая черта, которую вы добавляете в свою модель. Вот пример кода из документации:

use Illuminate\Database\Eloquent\Model;
use Spatie\Activitylog\Traits\LogsActivity;

class NewsItem extends Model
{
    use LogsActivity;   
    protected static $logAttributes = ['*'];       
    protected static $logAttributesToIgnore = ['text'];       
    protected static $logOnlyDirty = true;
}

Это иллюстрирует несколько различных настроек, в том числе использование $ logOnlyDirty, который будет регистрировать только измененные элементы, по сравнению с настройкой по умолчанию предоставления полного до / после объекта. Вы также можете игнорировать некоторые атрибуты, которые вас не интересуют (например, отметки времени или вычисленные поля.

0 голосов
/ 02 апреля 2019

Используйте наблюдателей моделей Laravel (https://laravel.com/docs/5.8/eloquent#observers)), чтобы наблюдать за событиями на моделях и записывать то, что вам нужно. Вы можете наблюдать created, creating, updated, updating, deleted, deleting, saved, saving события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...