Если вы ранее использовали Eloquent в средних и крупных проектах, возможно, вы столкнулись с ситуацией, когда вы хотите принять меры, когда что-то случится с вашими моделями. Eloquent предоставляет удобный способ сделать это.
Образец Наблюдателя
Шаблон наблюдателя — это шаблон разработки программного обеспечения, в котором объект, называемый субъектом, ведет список своих зависимых, называемых наблюдателями, и автоматически уведомляет их о любых изменениях состояния, обычно вызывая один из их методов. — Википедия
В нашем случае 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, обязательно разместите их ниже!