1


我需要一些帮助。我想在控制器的动作运行之前在 Zend Framework 2 中运行一个方法。我将我的方法放在 Module.php 的 onBootstrap 中,但它在操作启动之前不会运行。

在 Module.php 中:

public function onBootstrap(MvcEvent $e)
{
    $eventManager        = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);

    $app  = $e->getApplication();
    $em = $app->getEventManager();

    $em->attach(MvcEvent::EVENT_DISPATCH, function($e) {
        $controller = $e->getTarget();
        $controller->Init();
    });
}

我想在操作运行之前对我的适配器运行 Init() 方法,但它不起作用,我总是收到以下消息:
可捕获的致命错误:参数 1 传递给 Application\Model\Members::__construct() must是 Zend\Db\Adapter\Adapter 的一个实例,给定 null,在第 39 行的 PATH\module\Application\src\Application\Controller\AdminController.php 中调用并在 PATH\module\Application\src\Application\Model\ 中定义第 17 行的 members.php

成员类在应该运行的操作中,并且它的 __construct 需要有一个有效的 Adapter 对象,该对象应该在 Init() 方法中初始化。

有人可以帮我吗?非常感谢!

4

2 回答 2

7

尝试不同的方法:

我假设您的控制器扩展了Zend\Mvc\Controller\AbstractActionController. 在控制器中覆盖父级的onDispatch方法,以执行您需要执行的操作:

前任:

class YourController extends AbstractActionController {

    public function onDispatch($event){
        $this->Init();
        return parent::onDispatch($event);
    }
    //your other actions/init methods etc...

}
于 2013-10-28T22:04:49.540 回答
4

附加到事件时,您需要设置优先级 > 1。

例如。

$em->attach(MvcEvent::EVENT_DISPATCH, function($e) {
        $controller = $e->getTarget();
        $controller->Init();
    }, 100);

这确保了代码在调度前执行。

于 2015-01-27T09:17:22.900 回答