Coding

Model Observers

Обсерверы моделей в основном используются для внутренних операций с моделью перед записью в базу (-ing методы, хотя создаётся обсервер с -ed методами. Возможно, где-то я повернул не туда) - догенерации данных или создания связанной служебной модели. То есть те вещи, которые связаны непосредственно с жизнью этой модели.

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

  1. retrieved: after a record has been retrieved.
  2. creating: before a record has been created.
  3. created: after a record has been created.
  4. updating: before a record is updated.
  5. updated: after a record has been updated.
  6. saving: before a record is saved (either created or updated).
  7. saved: after a record has been saved (either created or updated).
  8. deleting: before a record is deleted or soft-deleted.
  9. deleted: after a record has been deleted or soft-deleted.
  10. restoring: before a soft-deleted record is going to be restored.
  11. 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__);
        ...
    }

}

Оставить комментарий

avatar
  Подписаться  
Уведомление о