Использование событий моделей в Laravel 8

В этом руководстве я покажу на примерах, как работать с событиями моделей Eloquent в Laravel 8. Таких моделей в Laravel – двенадцать, на почти каждую операцию с моделью предусмотрено два события. Одно событие срабатывает перед операцией с объектом модели, а второе – после, что очень удобно. Вот полный список событий:

  • creating: возникает до операции добавления модели;
  • created: появляется после добавления модели;
  • updating: срабатывает до обновления модели;
  • updated: появляется после обновления;
  • deleting: возникает до удаления;
  • deleted: срабатывает после удаления модели;
  • retrieved: уведомляет об извлечении модели;
  • saving: возникает до создания или обновления модели;
  • saved: срабатывает после создания или обновления модели;
  • restoring: возникает до восстановления модели;
  • restored: появляется после восстановления модели;
  • replicating: сообщает о создании копии модели.

События особенно пригодятся в тех случаях, когда возникает необходимость добавления в базу данных числового или понятного пользователю идентификатора (слага) на основе названия страницы. Также события полезны в обратном случае, – когда нужно обновить слаг после удаления или обновления записей в базе данных. В таких ситуациях события моделей просто незаменимы.

Далее я покажу на примерах, как работают самые важные события, и как вы можете использовать их на практике.

В приведенных ниже примерах я продемонстрирую срабатывание событий creating, created, updating, updated и deleted, и по результатам в лог-файле сразу станет понятен принцип их работы.

Создаем модель с помощью событий

Сначала создадим файл Product.php, расположим его по адресу app/Models/Product.php и добавим в него следующий код:

<?php

  

namespace App\Models;

  

use Illuminate\Database\Eloquent\Factories\HasFactory;

use Illuminate\Database\Eloquent\Model;

use Log;

use Str;

   

class Product extends Model

{

    use HasFactory;

  

    protected $fillable = [

        'name', 'slug', 'detail'

    ];

  

    /**

     * Создание кода для метода

     *

     * @возвращение ответа()

     */

    public static function boot() {

  

        parent::boot();

  

        /**

         * Создание кода для метода

         *

         * @возвращение ответа()

         */

        static::creating(function($item) {            

            Log::info('Creating event call: '.$item); 

  

            $item->slug = Str::slug($item->name);

        });

  

        /** 

         * Создание кода для метода

         *

         * @возвращение ответа()

         */

        static::created(function($item) {           

            /*

                Код метода

            */ 

  

            Log::info('Created event call: '.$item);

        });

  

        /**

         * Создание кода для метода

         *

         * @возвращение ответа()

         */

        static::updating(function($item) {            

            Log::info('Updating event call: '.$item); 

  

            $item->slug = Str::slug($item->name);

        });

  

        /**

         * Создание кода для метода

         *

         * @возвращение ответа()

         */

        static::updated(function($item) {  

            /*

               Код метода

            */    

  

            Log::info('Updated event call: '.$item);

        });

  

        /**

         * Создание кода для метода

         *

         * @возвращение ответа()

         */

        static::deleted(function($item) {            

            Log::info('Deleted event call: '.$item); 

        });

    }

}

Здесь мы просто вызываем методы модели один за другим и получаем ответы.

Создание записи с использованием событий creating и created

Откройте для редактирования файл контроллера ProductController.php, расположенный по адресу app/Http/Controllers/ProductController.php и добавьте в него следующий код:

<?php

  

namespace App\Http\Controllers;

  

use App\Models\Product;

use Illuminate\Http\Request;

  

class ProductController extends Controller

{

    /**

     * Вывод листинга ресурса.

     *

     * @return \Illuminate\Http\Response

     */

    public function index()

    {

        Product::create([

            'name' => 'silver',

            'detail' => 'This is silver'

        ]);

  

        dd('done');

    }

}

Результат выполнения кода в лог-файле выглядит следующим образом:

[2020-10-20 14:39:04] local.INFO: Updating event call: {"id":5,"name":"silver updated","detail":"This is silver","created_at":"2020-10-20T14:37:26.000000Z","updated_at":"2020-10-20T14:37:26.000000Z","slug":"silver"}  

[2020-10-20 14:39:04] local.INFO: Updated event call: {"id":5,"name":"silver updated","detail":"This is silver","created_at":"2020-10-20T14:37:26.000000Z","updated_at":"2020-10-20T14:39:04.000000Z","slug":"silver-updated"}

Удаление записи с применением события deleted

Приведенный ниже код нужно вставить в файл контроллера ProductController.php, расположенный по адресу app/Http/Controllers/ProductController.php:

<?php

  

namespace App\Http\Controllers;

  

use App\Models\Product;

use Illuminate\Http\Request;

  

class ProductController extends Controller

{

    /**

     * Вывод листинга ресурса.

     *

     * @return \Illuminate\Http\Response

     */

    public function index()

    {

        Product::find(5)->delete();

   

        dd('done');

    }

}

Результат исполнения этого кода в лог-файле выглядит следующим образом:

[2020-10-21 03:14:45] local.INFO: Deleted event call: {"id":5,"name":"silver updated","detail":"This is silver","created_at":"2020-10-20T14:37:26.000000Z","updated_at":"2020-10-20T14:39:04.000000Z","slug":"silver-updated"}

Надеюсь, статья вам пригодилась. Возможно, вас также заинтересует руководство по назначению ролей и прав пользователей в Laravel 8.

Пожалуйста, оставьте свои мнения по текущей теме статьи. Мы очень благодарим вас за ваши комментарии, подписки, отклики, дизлайки, лайки!

Наталья Кайдаавтор-переводчик статьи «How to use Model Events in Laravel 8?»