Phalcon:如何使用应用程序事件以及放置它们的位置?

时间:2014-01-03 12:42:02

标签: php phalcon

我已经玩Phalcon框架已有一段时间了,但我还没弄清楚如何使用应用程序事件(通过EventManager)。

具体来说,我想创建一个'boot'事件,所以我只能为每个应用程序运行一次代码,而不是每个控制器运行一次(如果我扩展了ControllerBase就是这种情况)。

manual为我提供了使用的语法,但我仍然不知道如何使用它以及我应该放在哪个文件中。

我知道我可能只需要index.php中的'boot.php'文件,但这不是一个优雅的解决方案。

1 个答案:

答案 0 :(得分:3)

假设您拥有index.php文件,该文件是您的应用程序的入口点。在该文件中,您可以使用代码注册应用程序中的所有服务。我个人的偏好是保持index.php文件尽可能小,并将引导序列(注册服务)放在不同的文件中。

所以我会在index.php

<?php

use \Phalcon\DI\FactoryDefault as PhDi;

error_reporting(E_ALL);
date_default_timezone_set('US/Eastern');

if (!defined('ROOT_PATH')) {
    define('ROOT_PATH', dirname(dirname(__FILE__)));
}

try {

    include ROOT_PATH . "/app/var/bootstrap.php";

    /**
     * Handle the request
     */
    $di  = new PhDi();
    $app = new Bootstrap($di);

    echo $app->run(array());

} catch (\Phalcon\Exception $e) {
    echo $e->getMessage();
} catch (PDOException $e){
    echo $e->getMessage();
}

bootstrap.php包含初始化应用程序所需的所有服务所需的功能。其中一项服务如下:

public function initEventsManager($app)
{
    $evManager = new \Phalcon\Events\Manager();

    $app->setEventsManager($evManager);

    $evManager->attach(
        "application",
        function($event, $application) {
            switch ($event->getType()) {
                case 'boot':
                    $this->handleBoot();
                    break;
                case 'beforeStartModule':
                    $this->handleBeforeStartModule();
                    break;
                case 'afterStartModule':
                    $this->handleAfterStartModule();
                    break;
                case 'beforeHandleRequest':
                    $this->handleBeforeHandleRequest();
                    break;
                case 'afterHandleRequest':
                    $this->handleAfterHandleRequest();
                    break;
        }
    );
}

bootstrap.php文件中,您应该拥有handleBoot handleAfterHandleRequest等相关功能,以便按您需要的方式处理代码。

需要使用Phalcon \ Mvc \ Application作为参数调用上述注册事件管理器的函数。放在这里的好地方(基于例子)

https://github.com/phalcon/website/blob/master/app/var/bootstrap.php#L62