Статьи

Совет: удобная магия красноречивых наблюдателей

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

Laravel Logo

Образец Наблюдателя

Шаблон наблюдателя — это шаблон разработки программного обеспечения, в котором объект, называемый субъектом, ведет список своих зависимых, называемых наблюдателями, и автоматически уведомляет их о любых изменениях состояния, обычно вызывая один из их методов. — Википедия

В нашем случае Eloquent модели могут уведомлять нас об изменениях в данной модели.

Модельные события

Eloquent предоставляет несколько полезных событий для мониторинга состояния модели: creating , created , updating , updated , deleting , deleted , saving , saved , restoring , restored .

Обратите внимание на разницу «ing / ed».

  • creating : вызывается перед сохранением нового участника.
  • created : Вызывается после сохранения члена.

Eloquent также запускает похожие события, которые мы можем слушать . Приведенный ниже пример присоединяет слушателя к событию creating в модели Member .

 Event::listen("eloquent.created: App\\Member", function(Member $member) { // do something }); 

Создание наблюдателей

Давайте начнем с создания нового класса в пространстве имен App\Observers и начнем определять наши методы.

 // app\Observers\MemberObserver.php namespace App\Observers; use App\Member; class MemberObserver { public function deleting(Member $member) { // do something } } 

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

Каждый участник может подписаться на несколько сервисов, и каждый сервис содержит много участников. Давайте предположим, что у нас не настроено каскадное удаление для связанной таблицы members_services , и нам нужно удалить связанные службы при удалении членов, чтобы избежать ошибок при доступе к подписанным членам для службы.

 // app\Observers\MemberObserver.php namespace App\Observers; use App\Member; class MemberObserver { public function deleting(Member $member) { $member->services()->delete(); } } как // app\Observers\MemberObserver.php namespace App\Observers; use App\Member; class MemberObserver { public function deleting(Member $member) { $member->services()->delete(); } } 

Теперь, последнее, это прикрепить этого наблюдателя к соответствующей модели. Мы можем сделать это где угодно, но практическое место это app\Providers\AppProvider.php файл app\Providers\AppProvider.php внутри метода загрузки.

 class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { Member::observe("App\\Observers\\MemberObserver"); } } 

Я знаю, что пример каскадного удаления был прост и мог быть выполнен в контроллере или напрямую через MySQL, но это всего лишь подтверждение концепции.

Хорошая вещь в Eloquent наблюдателей заключается в том, что мы можем прервать текущее действие, возвращая ложное значение из метода обратного вызова:

 class MemberObserver { public function deleting(Member $member) { $member->deleted_at = Carbon::now(); $member->save(); return false; } } как class MemberObserver { public function deleting(Member $member) { $member->deleted_at = Carbon::now(); $member->save(); return false; } } 

В приведенном выше примере мы мягко удаляем элементы и возвращаем false чтобы отменить фактическое действие удаления.


Eloquent имеет множество скрытых функций, и это одна из них. Вы увидите, что это широко используется в больших приложениях и CMS. Если у вас есть какие-либо вопросы или комментарии по поводу Eloquent, обязательно разместите их ниже!