ZF3 — EventManager и отправка события

в более старом приложении ZF2 я меняю макет в прослушивателе отправки, если совпадающий маршрут начинается с admin. Теперь я начал новый проект и хочу использовать компоненты ZF3, но в диспетчере событий есть некоторые изменения, и я получаю следующее исключение:

Uncaught TypeError: Аргумент 2, переданный в Zend\EventManager\EventManager::attach(), должен вызываться, не указан

Я не знаю, как с этим справиться в ZF3. Вот мои соответствующие исходные коды для изменения макета в моем приложении ZF2:

Module.php

namespace Admin;

use Zend\EventManager\EventInterface;
use Zend\ModuleManager\Feature\BootstrapListenerInterface;

class Module implements BootstrapListenerInterface {

    public function onBootstrap(EventInterface $event) {
        $application = $event->getApplication();
        $eventManager = $application->getEventManager();
        $serviceManager = $application->getServiceManager();

        $eventManager->attach($serviceManager->get('Admin\Listener\Dispatch'));
    }

}

DispatchListener.php

namespace Admin\Listener;

use Zend\EventManager\AbstractListenerAggregate;
use Zend\EventManager\EventInterface;
use Zend\EventManager\EventManagerInterface;
use Zend\Mvc\MvcEvent;

class DispatchListener extends AbstractListenerAggregate {

    public function attach(EventManagerInterface $eventManager) {
        $this->listeners[] = $eventManager->attach(
            MvcEvent::EVENT_DISPATCH, array($this, 'onDispatch'), 100
        );
    }

    public function onDispatch(EventInterface $event) {
        $matchedRouteName = $event->getRouteMatch()->getMatchedRouteName();

        if (strpos($matchedRouteName, 'admin') === 0) {
            $event->getViewModel()->setTemplate('layout/admin');
        }
    }

}

person Dominik Barann    schedule 30.01.2017    source источник
comment
Попробуйте добавить второй аргумент в: public function attach(EventManagerInterface $eventManager, $priodity = 1) {...}   -  person tasmaniski    schedule 30.01.2017


Ответы (2)


zf3 больше ориентирован на развязку компонентов, кажется, что агрегаты были удалены, чтобы прикрепить событие, см. документ API.

менеджер событий

для краткости сообщение прикрепления говорит

attach($eventName, callable $listener, $priority = 1) : callable

Я надеюсь, что, поскольку вы не указываете имя события, вы получаете сообщение об ошибке

Обновить:

см. ссылку на руководство по переходу с версии 2 на версию 3 для менеджера событий

Удаленные функции

person Raj    schedule 30.01.2017
comment
Агрегаты все еще существуют, см. документацию: Документация ZF — Менеджер событий — Агрегаты - person Kwido; 31.01.2017
comment
Хорошо, я изменил вложение прослушивателя в моем Module.php на следующее, и теперь все работает нормально. Большое спасибо! $eventManager->attach(MvcEvent::EVENT_DISPATCH,[$serviceManager->get(Listener\DispatchListener::class), 'onDispatch']); - person Dominik Barann; 31.01.2017

В ZF3 вы можете легко изменить макет вашего контроллера:

<?php
namespace YourCompanyModule;

use Zend\ModuleManager\ModuleManager;
use Zend\Mvc\MvcEvent;

class Module
{
    // The "init" method is called on application start-up and 
    // allows to register an event listener.
    public function init(ModuleManager $manager)
    {
        // Get event manager.
        $eventManager = $manager->getEventManager();
        $sharedEventManager = $eventManager->getSharedManager();
        // Register the event listener method. 
        $sharedEventManager->attach(__NAMESPACE__, 'dispatch', 
                                    [$this, 'onDispatch'], 100);
    }

    // Event listener method.
    public function onDispatch(MvcEvent $event)
    {
        // Get controller to which the HTTP request was dispatched.
        $controller = $event->getTarget();
        // Get fully qualified class name of the controller.
        $controllerClass = get_class($controller);
        // Get module name of the controller.
        $moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'));

        // Switch layout only for controllers belonging to our module.
        if ($moduleNamespace == __NAMESPACE__) {
            $viewModel = $event->getViewModel();
            $viewModel->setTemplate('layout/layout2');  
        }        
    }

    // ...
}
person Norbert Boros    schedule 20.04.2018