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/*
)。