Где я могу разместить слушателей событий и обработчиков событий?

Мне интересно, куда положить слушателей и обработчиков событий 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: Я не придумал это как практику, но нашел его где-то на этом пути. Я, однако, не помню, где это было.