Где я могу разместить слушателей событий и обработчиков событий?
Мне интересно, куда положить слушателей и обработчиков событий Laravel. Кто-то сказал мне, что я могу положить их куда угодно. Это то, что я пробовал до сих пор.
# listeners/log.php
<?php
Event::listen('log.create', '[email protected]');
# handlers/LogHandler.php
<?php
class LogHandler {
public function create(){
$character = new Character;
$character->name = "test";
$character->save();
}
}
# controllers/MainController.php
public function test(){
Event::fire('log.create');
return "fired";
}
# start/global.php
ClassLoader::addDirectories(array(
app_path().'/commands',
app_path().'/controllers',
app_path().'/models',
app_path().'/database/seeds',
app_path().'/libraries',
app_path().'/listeners',
app_path().'/handlers',
));
Ответы
Ответ 1
Я собираюсь предположить, что вы спрашиваете об этом, потому что они не работают, а не для подтверждения того, что у вас есть.
В то время как правильно, что вы можете помещать прослушиватели событий в любом месте, вам нужно убедиться, что они действительно будут включены - Laravel не ищет ваш исходный код, ища их.
Мое любимое место для включения таких файлов находится в start/global.php
. Если вы посмотрите на нижнюю часть файла, вы увидите, какие фильтры включены, вы можете сделать то же самое, что и ваши слушатели. Было бы самым чистым держать их всех в одном файле слушателей, как и все ваши маршруты в одном файле маршрутов...
# start/global.php
require app_path().'/filters.php';
Ответ 2
Мое личное мнение состоит в том, что это плохая практика в целом, чтобы укусить слушателей событий в одном месте. Конечно, сегодня вам нужно всего 2 или 3, но область может быть добавлена в любой проект в любое время, возможно, добавление намного больше.
Вместо этого я обычно создаю каталог под каталогом app
(например, app/CompanyName
) и размещаю весь код моего приложения. Чтобы сообщить Laravel, как найти ваши файлы, вы можете затем обновить свой composer.json, если хотите:
"autoload": {
"classmap": [
// ...
],
"psr-4": {
"CompanyName\\" : "app/"
},
}
После этого обязательно запустите composer dump-autoload
.
Теперь вы можете создавать каталоги пространства имен внутри своего настраиваемого каталога приложений, например app/CompanyName/Events/
, и иметь возможность выделять прослушиватели событий в группы, которые имеют смысл, и помещать их внутри поставщика услуг, например:
<?php namespace CompanyName/Events;
// File: app/CompanyName/Events/LogEventsProvider.php
use Illuminate\Support\ServiceProvider;
class LogEventsProvider extends ServiceProvider
{
public function register()
{
Event::listen('log.create', 'CompanyName/Events/[email protected]');
}
public function create()
{
// ...
}
}
Теперь вы можете добавить этого поставщика услуг в свой app/config/app.php
и быть хорошим, чтобы идти, и иметь все связанные с ним прослушиватели событий в одном файле и ВСЕ ваши слушатели событий в одном каталоге, но отдельно, чтобы if что-то пошло не так с одним из них, вам не нужно искать через ВСЕ их, чтобы найти, где происходит ошибка.
NB: Я не придумал это как практику, но нашел его где-то на этом пути. Я, однако, не помню, где это было.