Laravel: предотвратить изменение ресурса API после обновления модели

Я реализую ЖУРНАЛ событий, происходящих в системе. Другими словами, определить момент создания объекта и сохранить созданные данные. Когда приходит обновление, мне нужно сохранить предыдущее состояние объекта и новое. Поскольку я использую ресурсы 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 обновлена ​​до O.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
280
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Это удивительный подход. Знаете ли вы, могу ли я получить предыдущие значения объекта до обновления? stackoverflow.com/questions/17367383/… Я прочитал этот ответ, но не знаю, возвращает ли эта функция первые созданные данные или предыдущие данные до последнего обновления.

Jacobo 02.04.2019 01:44

При использовании наблюдателя creating или updating вы можете получить предыдущее значение атрибута модели с помощью $model->getOriginal('attribute').

kkyeboah 02.04.2019 02:20

Это мне очень помогло.

Jacobo 02.04.2019 02:59

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

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

Есть библиотека, которая уже обрабатывает специфика того, как заставить все это работать вместе, которое как минимум может служить примером того, как все настроить, но уже способно делать то, что вы хотите.

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

Преимущество использования 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, которое будет регистрировать только измененные элементы, в отличие от значения по умолчанию, предоставляющего полное до/после объекта. Вы также можете игнорировать определенные атрибуты, которые вам не нужны (например, временные метки или вычисляемые поля).

Да, но моя главная проблема в том, что мне по-прежнему нужны предыдущие значения, даже с модельными отношениями наряду с новыми значениями. Это потому, что они должны иметь возможность сравнивать предыдущие данные и новые данные одновременно в случае обновления.

Jacobo 02.04.2019 01:59

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

gview 02.04.2019 02:05

Другие вопросы по теме