我有一个名为MyController的基本控制器,我从MyController扩展了controller,而不是AbstractActionController,这段代码有什么问题?
这不管用:
$sharedEventManager->attach('MyController', 'dispatch', function ($e) {
$controller = $e->getTarget();
},100) ;但这确实是:
$sharedEventManager->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function ($e) {
$controller = $e->getTarget();
},100) ;发布于 2014-06-29 11:30:46
SharedEventManager::attach()的第一个参数是要目标的事件管理器的标识。该标识被动态地分配给任何具有事件能力的类(实现Zend\EventManager\EventManagerAwareInterface),或者通过$eventManager->setIdentity()设置了它的标识。
这个问题涉及到\Zend\Mvc\Controller\AbstractActionController;这本身就是给任何扩展\Zend\Mvc\AbstractActionController (以及其他)的控制器的标识,允许只允许一个id到attach()来针对所有控制器。
要只针对一个控制器(这是完全有效的,有很多用例),您可以通过两种方式这样做:
SharedEventManager,控制器类的外部(就像您一直做的那样)通过SharedEventManager
使用完全限定的类名,因为它作为标识添加到事件管理器中。
$sharedEventManager->attach(
'MyModule\Controller\FooController', 'dispatch', function($e){
// do some work
});控制器内的
我修改了普通的attachDefaultListeners()方法(它被自动调用),您可以在这里直接附加事件。
namespace MyModule\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\EventManager\EventInterface;
class FooController extends AbstractActionController
{
protected function attachDefaultListeners()
{
// make sure you attach the defaults!
parent::attachDefaultListeners();
// Now add your own listeners
$this->getEventManager()->attach('dispatch', array($this, 'doSomeWork'));
}
public function doSomeWork(EventInterface $event) {
// do some work
}
}发布于 2014-06-28 19:38:02
你为什么要用你自己的基地控制器?这样做没有真正的好处,除非你有罕见的边缘情况。
您的基本控制器类在AbstractController中丢失了这个部分:
/**
* Set the event manager instance used by this context
*
* @param EventManagerInterface $events
* @return AbstractController
*/
public function setEventManager(EventManagerInterface $events)
{
$events->setIdentifiers(array(
'Zend\Stdlib\DispatchableInterface',
__CLASS__,
get_class($this),
$this->eventIdentifier,
substr(get_class($this), 0, strpos(get_class($this), '\\'))
));
$this->events = $events;
$this->attachDefaultListeners();
return $this;
}看到setIdentifiers打来的电话了吗?这就是为什么第二个例子有效的原因。
另外,我怀疑您可能不会在控制器的dispatch()方法中实际触发分派事件。
另外,请注意:不应该创建没有顶级命名空间的类。我所有的类都使用Xrks\供应商命名空间。
https://stackoverflow.com/questions/24469400
复制相似问题