Недавно я пришел к той же проблеме в одном из моих проектов Laravel 5, где я должен был регистрировать все события Model. Я решил использовать Traits
. Я создал ModelEventLogger
Trait и просто использовался во всех классах Model, которые необходимо было зарегистрировать. Я собираюсь изменить его в соответствии с вашими потребностями, которые приведены ниже.
<?php
namespace App\Traits;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Event;
/**
* Class ModelEventThrower
* @package App\Traits
*
* Automatically throw Add, Update, Delete events of Model.
*/
trait ModelEventThrower {
/**
* Automatically boot with Model, and register Events handler.
*/
protected static function bootModelEventThrower()
{
foreach (static::getModelEvents() as $eventName) {
static::$eventName(function (Model $model) use ($eventName) {
try {
$reflect = new \ReflectionClass($model);
Event::fire(strtolower($reflect->getShortName()).'.'.$eventName, $model);
} catch (\Exception $e) {
return true;
}
});
}
}
/**
* Set the default events to be recorded if the $recordEvents
* property does not exist on the model.
*
* @return array
*/
protected static function getModelEvents()
{
if (isset(static::$recordEvents)) {
return static::$recordEvents;
}
return [
'created',
'updated',
'deleted',
];
}
}
Теперь вы можете использовать этот признак в любой Модели, на которую хотите бросить события. В Вашем корпусе Article
Модель.
<?php namespace App;
use App\Traits\ModelEventThrower;
use Illuminate\Database\Eloquent\Model;
class Article extends Model {
use ModelEventThrower;
//Just in case you want specific events to be fired for Article model
//uncomment following line of code
// protected static $recordEvents = ['created'];
}
Теперь в вашем app/Providers/EventServiceProvider.php
, в boot()
методе зарегистрировать обработчик событий для Article
.
public function boot(DispatcherContract $events)
{
parent::boot($events);
$events->subscribe('App\Handlers\Events\ArticleEventHandler');
}
Теперь создаст класс ArticleEventHandler
под app/Handlers/Events
каталога, как показано ниже,
<?php namespace App\Handlers\Events;
use App\Article;
class ArticleEventHandler{
/**
* Create the event handler.
*
* @return \App\Handlers\Events\ArticleEventHandler
*/
public function __construct()
{
//
}
/**
* Handle article.created event
*/
public function created(Article $article)
{
//Implement logic
}
/**
* Handle article.updated event
*/
public function updated(Article $article)
{
//Implement logic
}
/**
* Handle article.deleted event
*/
public function deleted(Article $article)
{
//Implement logic
}
/**
* @param $events
*/
public function subscribe($events)
{
$events->listen('article.created',
'App\Handlers\Events\[email protected]');
$events->listen('article.updated',
'App\Handlers\Events\[email protected]');
$events->listen('article.deleted',
'App\Handlers\Events\[email protected]');
}
}
Как вы можете видеть из различных ответов, из разных пользователей, есть более чем один способ обработки модельных событий. Существуют также пользовательские события, которые могут быть созданы в папке «События» и могут обрабатываться в папке «Обработчик» и могут отправляться из разных мест. Я надеюсь, что это помогает.
Я думаю, что вы можете смело перемещать '$ reflect = new \ ReflectionClass ($ model);' в 'bootModelEventThrower()' вне '' foreach' '' static :: class' вместо '$ model'. Вы также можете получить короткое имя с помощью 'substr (static :: class, strrpos (static :: class, '\\') + 1)'. – Parziphal
@ pinkel-vansia элегантный способ генерации общих событий модели. Я также соглашаюсь на @renocor, я использовал функцию function (Model $ model) ($ reflection, $ eventName) '. – raphael