Как отлаживать прослушиватели событий Laravel eloquent

Я использую Laravel, и что-то изменяет свойство перед его сохранением в базе данных.

В Database/Eloquent/Model.php я могу изменить метод save() следующим образом:

dd($this->my_property);
if ($this->fireModelEvent('saving') === false) {
    return false;
}
dd($this->my_property);

В первом dd() значение соответствует тому, что я ожидал, во втором оно было изменено.

Я пытаюсь просмотреть код Laravel, но, насколько я могу судить, он получается из замыкания, которое выглядит так, когда dd() выполняет:

Closure($event, $payload) {#4282 ▼
  class: "Illuminate\Events\Dispatcher"
  this: Illuminate\Events\Dispatcher {#35 …}
  use: {▼
    $listener: Closure(QueryExecuted $query) {#106 …}
    $wildcard: false
  }
  file: "my/path/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php"
  line: "453 to 459"
}

Это не совсем полезно, потому что Events/Dispatcher.php:453 — это просто замыкание, которое вызывает $listener, что тоже является замыканием. Попытка отладить его дальше кажется очень сложной, потому что вы в конечном итоге перехватываете более ранние вызовы этого метода, не связанные с красноречивым обновлением.

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

Точнее, я обновляю массив json, но по какой-то причине он всегда объединяет массив, а не перезаписывает его. В настоящее время я понятия не имею, есть ли это что-то в моей кодовой базе или в Laravel по умолчанию.

Пример:

// ['one' => 10, 'two' => 20]
dump($model->counts);

$model->update(['counts' => ['three' => 30, 'four' => 40]]);

// ['one' => 10, 'two' => 20, 'three' => 30, 'four' => 40]
dump($model->counts);

// Expected result would be:
// ['three' => 30, 'four' => 40]
dump($model->counts);

Таким образом, в какой-то момент существующие «счетчики» объединяются со старыми «счетчиками», а не перезаписывают их.

У вас есть мутатор для вашей модели? laravel.com/docs/11.x/eloquent-mutators Вы также можете запустить php artisan model:show NameOfModel, чтобы узнать, есть ли наблюдатель, который прослушивает события модели.

parapente 13.06.2024 18:12

модель:шоу интересное, я такого раньше не видела. Но, к сожалению, он показывает просто «Закрытие», а не там, где оно определено saving ............................................................‌​............. Closure, Closure, App\Domain\Users\Observers\UsersObserver@saving

John Mellor 14.06.2024 12:54

Если массив объединяет не UsersObserver, посмотрите, не добавляет ли какой-либо из признаков, добавленных вами в модель, замыкание. Например, запуск команды «grep -r create app» дает мне результат типа app/Http/Traits/UsesUuid.php: static::creating(function ($model) {, потому что я использую признак UsesUuid в одной из моих моделей.

parapente 14.06.2024 13:01

Ах, вот это от черты! Похоже, что у Laravel есть недокументированные (насколько я вижу) средства загрузки с использованием типажа с использованием $model->{'boot'.class_basename($trait)}, а пакет, который я установил, реализовал static::saving( ) в рамках этого метода. Большое спасибо! Если бы вы добавили это как правильный ответ, я бы принял его :)

John Mellor 14.06.2024 13:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
4
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В Laravel 11 есть команда, которая показывает различную информацию о ваших моделях, и одна из предоставляемых ею данных — это наблюдатели для этой модели. Это команда model:show, и вы можете вызвать ее, запустив:

php artisan model:show

Если в разделе Observer не упоминается конкретный класс Observer, но указан Closure, вам необходимо вернуться к классу модели. У вас может быть список замыканий или признак, определяющий такое замыкание. Если это локальная черта, вы можете найти ее, запустив простую команду grep в корне вашего проекта:

grep -r creating app

Например, выполнив приведенную выше команду в моем проекте, я получаю результат:

app/Http/Traits/UsesUuid.php:    static::creating(function ($model) {
...

потому что я использую признак UsesUuid в одной из своих моделей.

Спасибо, в моем случае мне пришлось искать в папке поставщика, используя grep -r "static::saving" vendor

John Mellor 14.06.2024 17:04

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