Php ZF2如何监听特定控制器的调度事件

Php ZF2如何监听特定控制器的调度事件,php,zend-framework2,Php,Zend Framework2,如何侦听特定控制器的调度事件?目前,我做了以下工作: <?php namespace MyModule\Controller; use Zend\Mvc\Controller\AbstractActionController; // Or AbstractRestfulController or your own use Zend\View\Model\ViewModel; // Or JsonModel or your own use Zend\Mvc\MvcEvent; clas

如何侦听特定控制器的调度事件?目前,我做了以下工作:

<?php

namespace MyModule\Controller;

use Zend\Mvc\Controller\AbstractActionController; // Or AbstractRestfulController or your own
use Zend\View\Model\ViewModel; // Or JsonModel or your own
use Zend\Mvc\MvcEvent;

class MyController extends AbstractActionController
{
    public function onDispatch(MvcEvent $e)
    {
        $this -> layout('my-layout'); // The layout name has been declared somewhere in your config
        return parent::onDispatch($e); // Get back to the usual dispatch process
    }

    // ... Your actions
}
Module.php

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

    $eventManager->attach($serviceManager->get('MyListener'));
}
class MyListener extends AbstractListenerAggregate {

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

    public function setLayout(EventInterface $event) {
        $event->getViewModel()->setTemplate('mylayout');
    }
}
MyListener.php

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

    $eventManager->attach($serviceManager->get('MyListener'));
}
class MyListener extends AbstractListenerAggregate {

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

    public function setLayout(EventInterface $event) {
        $event->getViewModel()->setTemplate('mylayout');
    }
}

这将设置所有控制器调度的布局。现在,我只想在应用程序分派特定控制器时设置布局。

您必须将事件侦听器连接到SharedEventManager,并侦听“Zend\Stdlib\DispatchableInterface”接口的MvcEvent::event_分派

请参见一个示例:

$eventManager->getSharedManager()
            ->attach(
                'Zend\Stdlib\DispatchableInterface',
                MvcEvent::EVENT_DISPATCH,
                $serviceManager->get('MyListener')
            );
在侦听器中,您可以获得目标控制器的实例,如so$controller=$event->getTarget()

因此,最终,方法“setLayout”可能如下所示:

public function setLayout(MvcEvent $event)
{
    $controller  = $event->getTarget();

    if ($controller instanceof MyController)
    {
        $event->getViewModel()->setTemplate('mycontroller-layout');
    }
}

像所有模块都有一个onBootstrap()方法一样,所有扩展AbstractController的控制器都有一个onDispatch()方法

考虑到要为单个特定控制器应用不同的布局,只需执行以下操作:

<?php

namespace MyModule\Controller;

use Zend\Mvc\Controller\AbstractActionController; // Or AbstractRestfulController or your own
use Zend\View\Model\ViewModel; // Or JsonModel or your own
use Zend\Mvc\MvcEvent;

class MyController extends AbstractActionController
{
    public function onDispatch(MvcEvent $e)
    {
        $this -> layout('my-layout'); // The layout name has been declared somewhere in your config
        return parent::onDispatch($e); // Get back to the usual dispatch process
    }

    // ... Your actions
}

谢谢,这对我的情况很有帮助。要添加基于路由而非控制器的自定义布局,请查看。允许基于路由的不同布局,包括通配符(例如
admin/*
)。