Как создать событие (event) в Laravel при создании записи, при редактировании записи или при удалении записи.
Доброго времени суток. В одной статье «Создание событий (Event) в Laravel 5» я уже писал как создать event в Laravel. Но это было в далеком 15 году. Прошло уже достаточно времени – Laravel изменился. Поэтому давайте рассмотрим снова, как создавать события в Laravel. А создавать события (event) мы будем для модели. Т.е. наши события будут возникать, когда мы создадим, изменим или удалим запись. Например, для ведения логов. (заодно и рассмотрим, как писать лог в файл).
И так приступим. Я не буду рассказывать как устанавливать и настраивать Laravel.
Шаг 1. Создание таблицы
Первое, что мы сделаем – это создадим таблицу, например, с категориями. Для этого выполните в консоли следующую команду:
php artisan make:migration create_categories_table --create=categories
Данной командой мы создали файл миграции.
Миграция создана. Переходим к редактированию файла create_categories_table.
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateCategoriesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('categories', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('categories'); } }
Все миграцию описали. Теперь можем ее запустить. Для этого выполните следующую команду:
php artisan migrate
Миграция успешно выполнена. Если мы перейдем в нашу базу данных, то увидим в ней таблицу categories с полями:
- id
- name
- created_at
- updated_at
Замечание. Если вам не нужны поля created_at и updated_at или вы хотите их переименовать, то как это сделать вы можете прочитать в моих статьях «Laravel: работаем с created_at и updated_at (убираем поля, переопределяем updated_at и убираем поле updated_at)» и «Переименование полей created_at и updated_at в Eloquent Laravel»
Шаг 2. Создание события в Laravel для Category
Для создания события (event) в Laravel нужно использовать artisan команду:
php artisan make:event CategoryEvent
Событие в Laravel создано. Открываем файл app\Events\CategoryEvent.php на редактирование:
<?php namespace App\Events; use Illuminate\Broadcasting\Channel; use Illuminate\Queue\SerializesModels; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Broadcasting\PresenceChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; use App\Category; use Log; class CategoryEvent { use Dispatchable, InteractsWithSockets, SerializesModels; /** * Create a new event instance. * * @return void */ public function __construct() { // } /** * Get the channels the event should broadcast on. * * @return \Illuminate\Broadcasting\Channel|array */ public function broadcastOn() { return new PrivateChannel('channel-name'); } public function categoryCreated(Category $category) { Log::info("Category Created: ".$category); } public function categoryUpdated(Category $category) { Log::info("Category Updated: ".$category); } public function categoryDeleted(Category $category) { Log::info("Category Deleted: ".$category); } }
Шаг 3. Регистрация события в Laravel.
Регистрация событий происходит в файле app\Providers\EventServiceProvider.php. В свойство $listen добавим наши события:
<?php namespace App\Providers; use Illuminate\Support\Facades\Event; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ 'App\Events\Event' => [ 'App\Listeners\EventListener', ], 'category.created' => [ 'App\Events\CategoryEvent@categoryCreated', ], 'category.updated' => [ 'App\Events\CategoryEvent@categoryUpdated', ], 'category.deleted' => [ 'App\Events\CategoryEvent@categoryDeleted', ], ]; /** * Register any events for your application. * * @return void */ public function boot() { parent::boot(); // } }
Шаг 4. Создание модели в Laravel
Давайте создадим модель для нашей таблицы categories. Для этого необходимо выполнить следующую команду:
php artisan make:model Category
Модель создана. Давайте в нее добавим следующий код:
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Event; class Category extends Model { protected $table = 'categories'; protected $fillable = [ 'name', ]; public static function boot() { parent::boot(); static::created(function($category){ Event::fire('category.created',$category); }); static::updated(function($category){ Event::fire('category.updated',$category); }); static::deleted(function($category){ Event::fire('category.deleted',$category); }); }
Шаг 5. Добавление маршрутов в Laravel.
Добавляем маршруты в файл routes/web.php
Route::get('add', function(){ \App\Category::create(['name'=>'test 1']); dd('Категория добавлена'); }); Route::get('edit', function(){ \App\Category::find(1)->update(['name'=>'test change']); dd('Категория изменена'); }); Route::get('delete', function(){ \App\Category::find(1)->delete(); dd('Категория удалена'); });
Отлично. Провеяем.
Создадим категорию, переходим <домен>/add
Теперь изменим категорию, переходим <домен>/edit
И удалим категорию, переходим <домен>/delete
Все отработало без ошибок. Теперь давайте откроем файл с логами и посмотрим, что у нас получилось.
[2018-02-01 10:32:17] local.INFO: Category Created: {"name":"test 1","updated_at":"2018-02-01 10:32:17","created_at":"2018-02-01 10:32:17","id":1} [2018-02-01 10:32:22] local.INFO: Category Updated: {"id":1,"name":"test change","created_at":"2018-02-01 10:32:17","updated_at":"2018-02-01 10:32:22"} [2018-02-01 10:32:49] local.INFO: Category Deleted: {"id":1,"name":"test change","created_at":"2018-02-01 10:32:17","updated_at":"2018-02-01 10:32:22"}
Вот, как-то так.
Заключение.
Мы с вами создали три события, которые реагируют на создание, редактировании или удалении записи. А также рассмотрели, как записывать логи в файл. Как видите создание событий (event) в Laravel простой процесс.