ZF3: Как настроить EventManager событие MvcEvent::EVENT_RENDER для отработки только в одном Модуле?

156
02 июня 2019, 19:20

Есть два модуля: Application и Blog, в каждом из них есть файл Module.php со своей логикой.
В этих файлах есть метод onBootstrap в нем я запускаю EventManager на слушание события MvcEvent::EVENT_RENDER и ожидаю что модули Application и Blog не будут пресекается, но на деле обрабатывают оба метода, как это изменить? Хочу что бы в каждый модуль был приватным

Примерный листинг Module.php

namespace Application;
use Zend\Mvc\MvcEvent;
class Module
{
    /**
     * Listen to the bootstrap event
     *
     * @param MvcEvent $e
     */
    public function onBootstrap(MvcEvent $e)
    {
        /**
         * настройки EVENT_RENDER
         */
        $eventManager = $e->getApplication()->getEventManager();
        $eventManager->attach(MvcEvent::EVENT_RENDER, [$this, 'onRender']);
    }
    public function onRender($e)
    {
        var_dump(__METHOD__);
    }
Answer 1

Решение: Создаём метод init() в нем регистрируем общий SharedManager слушателя, вешаем его на MvcEvent::EVENT_DISPATCH для текущего __NAMESPACE__, после чего повешенный наш метод, будет отрабатываться только для текущего модуля

Файл: Module.php

<?php 
namespace Application;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
use Zend\ModuleManager\ModuleManagerInterface;
use Zend\Mvc\MvcEvent;
/**
 */
class Module implements ConfigProviderInterface
{
    public function getConfig()
    {
        return array_merge(
            require __DIR__ . '/../config/module.config.php',
            require __DIR__ . '/../config/router.config.php'
        );
    }
    public function init(ModuleManagerInterface $manager)
    {
        var_dump(__METHOD__);
        $eventManager = $manager->getEventManager();
        // Register the event listener method.
        $sharedEventManager = $eventManager->getSharedManager();
        $sharedEventManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH,  
                                          [$this, 'onDispatch'], 100);
    }
    public function onDispatch(MvcEvent $e)
    {
        var_dump(__METHOD__);
        $eventManager = $e->getApplication()->getEventManager();
        $eventManager->attach(MvcEvent::EVENT_RENDER, [$this, 'onRender']);
        $eventManager->attach(MvcEvent::EVENT_RENDER_ERROR, [$this, 'onRenderError']);
        $eventManager->attach(MvcEvent::EVENT_FINISH, [$this, 'onFinish']);
    }
    public function onRender($e)
    {
        var_dump(__METHOD__);
    }
    public function onRenderError($e)
    {
        var_dump(__METHOD__);
    }
    public function onFinish($e)
    {
        var_dump(__METHOD__);
    }
READ ALSO
Поправьте мой foreach плыз

Поправьте мой foreach плыз

Дано: два массиваВ первом 8 букв, во втором 8 цифр

148
Указатель на метод класса и скобки

Указатель на метод класса и скобки

Чем обусловлена невозможность писать указатель на метод в скобках? Почему запись указателя на метод должна быть именно

150
Как заменить символы только в первой половине строки?

Как заменить символы только в первой половине строки?

Решаю задачку, не понимаю как сделать замену только в первой половине строки

166