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


Phalcon PHP - attach event manager to router in non-micro app without rolling my own EventsManager

我正试图将这样的东西添加到非微型应用程序中,但我不确定如何在不推出自己的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;
        }
    }
});

想法?

谢谢!

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

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

如果不是:

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

编辑:

是的,从文档中还不太清楚是否有共享的事件管理器,我看到的所有示例都只显示了新创建的实例的使用情况。看看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'));