Обсерверы моделей в основном используются для внутренних операций с моделью перед записью в базу (-ing методы, хотя создаётся обсервер с -ed методами. Возможно, где-то я повернул не туда) - догенерации данных или создания связанной служебной модели. То есть те вещи, которые связаны непосредственно с жизнью этой модели.
Eloquent модели запускают несколько событий, позволяя нам подключиться к следующим моментам в жизненном цикле модели:
- retrieved: after a record has been retrieved.
- creating: before a record has been created.
- created: after a record has been created.
- updating: before a record is updated.
- updated: after a record has been updated.
- saving: before a record is saved (either created or updated).
- saved: after a record has been saved (either created or updated).
- deleting: before a record is deleted or soft-deleted.
- deleted: after a record has been deleted or soft-deleted.
- restoring: before a soft-deleted record is going to be restored.
- restored: after a soft-deleted record has been restored.
Создать обсервер можно с помощью artisan:
php artisan make:observer CommentObserver --model=Comment;
Далее необходимо прописать обсервер в AppServiceProvider:
<?php namespace App\Providers; ... use App\Comment; use App\Observers\CommentObserver; class AppServiceProvider extends ServiceProvider { ... public function boot() { ... Comment::observe(CommentObserver::class); } }
Теперь можно описать методы обсервера и просмотреть результат:
<?php namespace App\Observers; use App\Comment; class CommentObserver { /** * Handle the comment "saving" event. * * @param \App\Comment $comment * @return void */ public function saving(Comment $comment) { $comment->body = str_replace(["\r\n", "\r", "\n"], '<br>', $comment->body); } /** * Handle the comment "saved" event. * * @param \App\Comment $comment * @return void */ public function saved(Comment $comment) { $comment->createCustomevent(); $comment->sendEmailNotification(); } ... }
Здесь мы меняем тело комментария перед сохранением и отправляем email уведомление после сохранения модели.
Метод comment->sendEmailNotification() я описал в непосредственно в модели, если дойдут руки - перенесу куда-нибудь.
<?php namespace App; use Illuminate\Database\Eloquent\Model; use App\Customevent; class Comment extends Model { ... /** * send Email Notification. * * @return void */ public function sendEmailNotification() { info(__METHOD__); ... } }
Оставить комментарий