another_dream
@another_dream
Backend-разработчик, Laravel/ZF2/Yii2

Как реализовать прослушивание событий или каким вообще образом решить задачу?

Имеется самописная админка на Ларе. Работает она на двух контроллерах - AdminController и EntityController. Первый - системные страницы, вроде конфигурации, экспорта/импорта данных в БД и прочее. Второй - работа с сущностями, например, новости, каталог и подобное (список, редактирование, копирование, удаление, сохранение, etc).
Параметры каждой сущности хранятся в конфигурационном файле (это не важный момент).
Каким образом реализовать прослушивание событий, чтобы, например, при создании записи определенной сущности (например создание новой новости) отрабатывал определенный код (в контроллере отдельном?).

Идея такова - при создании новости нужно проверять имеется ли галочка "Кросспостинг" и при наличии оной необходимо передавать модель новости с заполненными полями в контроллер, например CrosspostController@social, где будут уже производится дополнительные манипуляции.

Буду благодарен за любую помощь.
Спасибо, господа.

Update:
Окей, с отлавливанием событий разобрался.
В модели News имеем следующий код:
public static function boot()
    {
        parent::boot();

        static::creating(function($news)
        {
            dd('Create new item');
        });
    }

Как вынести код из static::creating(function($news) { ... }) в контроллер отдельный? Например, в CrosspostController@social.

Подойдет ли следующий вариант?
// App/Models/News
public static function boot()
    {
        parent::boot();

        static::creating(function($news)
        {
            Event::fire('news.createcrosspost', array($news));
        });
    }
// App/Providers/EventServiceProvider

protected $listen = [
		'news.createcrosspost' => [
			'CrosspostController@social',
		],
	];
  • Вопрос задан
  • 214 просмотров
Решения вопроса 3
DJZT
@DJZT
Laravel - code for you
Доку повнимательней. Даже на русском есть Тык
Ответ написан
Комментировать
wielski
@wielski
✔ Совет: Вам помогли? Отметьте ответы решением.
Ивенты.

В helpers.php у меня такой код:
function listen($event, $fire){
  Event::listen($event, $fire);
}


Там где код должен исполняться:
event('entity.news.add');

При каком-либо условии создаем для этого event листенер:
listen('entity.news.add', function(){
   //тут код
});

Учтите, что для одного события (event) может быть создан 1 и более listen.
Ответ написан
Комментировать
another_dream
@another_dream Автор вопроса
Backend-разработчик, Laravel/ZF2/Yii2
Andrzej Wielski Станислав Почепко
Окей, с отлавливанием событий разобрался.
В модели News имеем следующий код:
public static function boot()
    {
        parent::boot();

        static::creating(function($news)
        {
            dd('Create new item');
        });
    }

Как вынести код из static::creating(function($news) { ... }) в контроллер отдельный? Например, в CrosspostController@social.

Подойдет ли следующий вариант?
// App/Models/News
public static function boot()
    {
        parent::boot();

        static::creating(function($news)
        {
            Event::fire('news.createcrosspost', array($news));
        });
    }
// App/Providers/EventServiceProvider

protected $listen = [
		'news.createcrosspost' => [
			'CrosspostController@social',
		],
	];
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы