Использование прослушивателя событий модели в Laravel 5

Я хотел бы убедиться, что я правильно использовал прослушиватели событий модели в Laravel 5, и я ничего не испортил (слушатель против обработчика?). Мое решение отлично работает, но мне интересно, развился ли я в соответствии с концепцией и соглашением Laravel 5.

Цель: всегда задавать значение $ issue-> status_id при некотором значении при сохранении модели.

В приложении \ Providers \ EventServiceProvider.php

<?php namespace App\Providers; ... class EventServiceProvider extends ServiceProvider { ... public function boot(DispatcherContract $events) { parent::boot($events); Issue::saving('App\Handlers\Events\SetIssueStatus'); } } 

В приложении \ Handlers \ Events \ SetIssueStatus.php

 <?php namespace App\Handlers\Events; ... class SetIssueStatus { ... public function handle(Issue $issue) { if (something) { $issueStatus = IssueStatus::where(somethingElse)->firstOrFail(); } else { $issueStatus = IssueStatus::where(somethingAnother)->firstOrFail(); } // issue_status() is One-to-One relations with IssueType (belongsTo) $issue->issue_status()->associate($issueStatus); } } 

Спасибо за ваше время.

Solutions Collecting From Web of "Использование прослушивателя событий модели в Laravel 5"

Как вы сказали, у вас есть рабочая версия, и она действительная, теперь вам решать, подходит ли вам.

Просто для того, чтобы уточнить, я не говорю, что это лучшие решения, они справедливы по-другому.

Поскольку то, что вы делаете, характерно для модели Issue или, по крайней мере, это не похоже на общее событие, вы можете настроить его на своей модели напрямую

 <?php namespace App; use Illuminate\Database\Eloquent\Model; use IssueStatus; class Issue extends Model { protected static function boot() { parent::boot(); static::saving(function($issue){ if (something) { $issueStatus = IssueStatus::where(somethingElse)->firstOrFail(); } else { $issueStatus = IssueStatus::where(somethingAnother)->firstOrFail(); } // issue_status() is One-to-One relations with IssueType (belongsTo) $issue->issue_status()->associate($issueStatus); }); } } 

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

Сначала мы создаем нашу черту (в этом случае мы создали в корне нашего приложения) и извлекаем код, который я написал ранее, из модели:

 <?php namespace App use IssueStatus; trait IssueStatusSetter { protected static function boot() { parent::boot(); static::saving(function($model){ if (something) { $issueStatus = IssueStatus::where(somethingElse)->firstOrFail(); } else { $issueStatus = IssueStatus::where(somethingAnother)->firstOrFail(); } // issue_status() is One-to-One relations with IssueType (belongsTo) $model->issue_status()->associate($issueStatus); }); } } 

Теперь на моделях, где вы хотите его использовать, вы просто импортируете признак и объявляете его использование:

 <?php namespace App; use Illuminate\Database\Eloquent\Model; use IssueStatusSetter; class Issue extends Model { use IssueStatusSetter; } 

Теперь этот последний вариант я показал вам, что это универсальный вариант, который вы можете применить к каждой модели, просто объявив, что он используется в верхней части вашей модели.