Я использую 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);
Таким образом, в какой-то момент существующие «счетчики» объединяются со старыми «счетчиками», а не перезаписывают их.
модель:шоу интересное, я такого раньше не видела. Но, к сожалению, он показывает просто «Закрытие», а не там, где оно определено saving ......................................................................... Closure, Closure, App\Domain\Users\Observers\UsersObserver@saving
Если массив объединяет не UsersObserver, посмотрите, не добавляет ли какой-либо из признаков, добавленных вами в модель, замыкание. Например, запуск команды «grep -r create app» дает мне результат типа app/Http/Traits/UsesUuid.php: static::creating(function ($model) {
, потому что я использую признак UsesUuid в одной из моих моделей.
Ах, вот это от черты! Похоже, что у Laravel есть недокументированные (насколько я вижу) средства загрузки с использованием типажа с использованием $model->{'boot'.class_basename($trait)}, а пакет, который я установил, реализовал static::saving( ) в рамках этого метода. Большое спасибо! Если бы вы добавили это как правильный ответ, я бы принял его :)
В 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
У вас есть мутатор для вашей модели? laravel.com/docs/11.x/eloquent-mutators Вы также можете запустить
php artisan model:show NameOfModel
, чтобы узнать, есть ли наблюдатель, который прослушивает события модели.