我已经玩Phalcon框架已有一段时间了,但我还没弄清楚如何使用应用程序事件(通过EventManager)。
具体来说,我想创建一个'boot'事件,所以我只能为每个应用程序运行一次代码,而不是每个控制器运行一次(如果我扩展了ControllerBase就是这种情况)。
manual为我提供了使用的语法,但我仍然不知道如何使用它以及我应该放在哪个文件中。
我知道我可能只需要index.php中的'boot.php'文件,但这不是一个优雅的解决方案。
答案 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