В настоящее время у меня есть приложение ZF2, настроенное с помощью «приложения» для одного модуля. Я грузиться приложение Закрепление событие таким образом:События ZF2 для нескольких модулей
namespace Application;
use Zend\Mvc\ModuleRouteListener;
use Zend\Mvc\MvcEvent;
class Module
{
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
$this->initTracking($e);
}
/**
* Initialises user tracking check
* @param MvcEvent $e
*/
public function initTracking(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$eventManager->attach('dispatch', function($e){
$objTracking = new \Application\Event\Tracking($e);
}, 200);
}
}
Теперь мне нужно, чтобы создать новый модуль «API», который должен обрабатывать только URLS начиная domain.com/api (настроить маршрутизатор в «API» файл конфигурации модуля для обработки только таких URL-адресов). Я грузиться «апи» модуль так же, как модуль «приложения», и я придаю специальный случай:
namespace Api;
use Zend\Mvc\ModuleRouteListener;
use Zend\Mvc\MvcEvent;
class Module
{
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
$this->initLogging($e);
}
/**
* Initialises loggging
* @param MvcEvent $e
*/
public function initLogging(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$eventManager->attach('dispatch', function($e){
$objLogger = new \Application\Event\Logging($e);
}, 200);
}
}
Что происходит, что, когда я называю domain.com/application - оба модуля инициализируется и события из обоих модулей запускаются. Мне нужно, чтобы события запускались в зависимости от приложения, которое отправляет действие.
Как я могу это достичь?
Спасибо Алекс. Первый из них, конечно, будет работать, но мне не нравится этот подход, так как события все еще срабатывают, даже если они не делают ничего, если не нужно. Также он добавляет дополнительную зависимость от имен маршрутов. Второе решение - можно ли связать событие с «Api \\ * \\ *» (подстановочный знак) вместо «Api \ Controller \ Index»? – Joe
Да, вы можете, «идентификатор» может быть любой строкой, которая вам нравится (хотя я бы рекомендовал имя интерфейса, если вы хотите настроить таргетинг на несколько контроллеров). Вам просто нужно убедиться, что каждый менеджер событий в контроллерах имеет этот новый набор идентификаторов (вы можете сделать это в 'setEventManager' или' __construct', используя '$ this-> getEventManager() -> addIdentifiers (['identifier']) 'в абстрактном контроллере или через сервисную фабрику). Ознакомьтесь с разделом ['SharedEventManager' в документации] (https://zf2.readthedocs.org/en/latest/tutorials/tutorial.eventmanager.html#shared-managers). – AlexP
Отлично. Большое спасибо Alex – Joe