Я хотел бы убедиться, что я правильно использовал прослушиватели событий модели в 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); } }
Спасибо за ваше время.
Как вы сказали, у вас есть рабочая версия, и она действительная, теперь вам решать, подходит ли вам.
Просто для того, чтобы уточнить, я не говорю, что это лучшие решения, они справедливы по-другому.
Поскольку то, что вы делаете, характерно для модели 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; }
Теперь этот последний вариант я показал вам, что это универсальный вариант, который вы можете применить к каждой модели, просто объявив, что он используется в верхней части вашей модели.