Phalcon PHP - 将事件管理器连接到非微应用程序中的路由器,而无需滚动我自己的EventsManager

时间:2014-09-02 20:12:11

标签: php router phalcon

我试图将这样的内容添加到非微型应用程序中,但我不确定如何在不滚动自己的EventsManager的情况下这样做。有没有办法获得对Phalcon的默认EventsManager的引用?

$eventsManager->attach("dispatch", function($event, $dispatcher, $exception) {

    if ($event->getType() == 'beforeException') {
        switch ($exception->getCode()) {
            case Phalcon\Dispatcher::EXCEPTION_HANDLER_NOT_FOUND:
            case Phalcon\Dispatcher::EXCEPTION_ACTION_NOT_FOUND:
                $dispatcher->forward(array(
                    'controller' => 'errors',
                    'action' => 'show404'
                ));
                return false;
        }
    }
});

思想?

谢谢!

1 个答案:

答案 0 :(得分:2)

当然有。您的调度员必须作为具有相同名称的服务注入您的DI。如果您的$eventsManagerPhalcon\DI\Injectable的实例:

$this->dispatcher->forward(…); 
$this->di->get('dispatcher')->forward(…);

如果不是:

DI::getDefault()->get('dispatcher')->forward(…);

修改

是的,从文档中不太清楚存在共享事件管理器,我看到的所有示例都只显示了新创建的实例的用法。看the code of the Di/FactoryDefault,似乎有一个同名的服务。您可以使用与上面相同的语法来获取它。

DI::getDefault()->get('eventsManager')->attach('dispatch', …);

整个事情应该是这样的,并且必须在配置DI之后在某处设置。

$di->get('eventsManager')->attach("dispatch:beforeException", function($event, $dispatcher, $exception) {
    switch ($exception->getCode()) {
        case Phalcon\Dispatcher::EXCEPTION_HANDLER_NOT_FOUND:
        case Phalcon\Dispatcher::EXCEPTION_ACTION_NOT_FOUND:
            $dispatcher->forward(array(
                'controller' => 'errors',
                'action' => 'show404'
            ));
            return false;
    }
});

$di->get('dispatcher')->setEventsManager($di->get('eventsManager'));