<?php
// $Id$
/**
* MyApp 封装了应用程序的基本启动流程和初始化操作,并为应用程序提供一些公共服务。
*
* 主要完成下列任务:
* - 初始化运行环境
* - 提供应用程序入口
* - 为应用程序提供公共服务
* - 处理访问控制和用户信息在 session 中的存储
*/
class MyApp
{
/**
* 应用程序的基本设置
*
* @var array
*/
protected $_app_config;
/**
* 构造函数
*
* @param array $app_config
*
* 构造应用程序对象
*/
protected function __construct(array $app_config)
{
// #IFDEF DEBUG
global $g_boot_time;
QLog::log('--- STARTUP TIME --- ' . $g_boot_time, QLog::DEBUG);
// #ENDIF
/**
* 初始化运行环境
*/
// 禁止 magic quotes
set_magic_quotes_runtime(0);
// 处理被 magic quotes 自动转义过的数据
if (get_magic_quotes_gpc())
{
$in = array(& $_GET, & $_POST, & $_COOKIE, & $_REQUEST);
while (list ($k, $v) = each($in))
{
foreach ($v as $key => $val)
{
if (! is_array($val))
{
$in[$k][$key] = stripslashes($val);
continue;
}
$in[] = & $in[$k][$key];
}
}
unset($in);
}
// 设置异常处理函数
set_exception_handler(array($this, 'exception_handler'));
// 初始化应用程序设置
$this->_app_config = $app_config;
$this->_initConfig();
Q::replaceIni('app_config', $app_config);
// 设置默认的时区
date_default_timezone_set(Q::ini('l10n_default_timezone'));
// 设置 session 服务
if (Q::ini('runtime_session_provider'))
{
Q::loadClass(Q::ini('runtime_session_provider'));
}
// 打开 session
if (Q::ini('runtime_session_start'))
{
session_start();
// #IFDEF DEBUG
QLog::log('session_start()', QLog::DEBUG);
QLog::log('session_id: ' . session_id(), QLog::DEBUG);
// #ENDIF
}
// 导入类搜索路径
Q::import($app_config['APP_DIR']);
Q::import($app_config['APP_DIR'] . '/model');
Q::import($app_config['MODULE_DIR']);
// 注册应用程序对象
Q::register($this, 'app');
}
/**
* 析构函数
*/
function __destruct()
{
// #IFDEF DBEUG
global $g_boot_time;
$shutdown_time = microtime(true);
$length = $shutdown_time - $g_boot_time;
QLog::log("--- SHUTDOWN TIME --- {$shutdown_time} ({$length})sec", QLog::DEBUG);
// #ENDIF
}
/**
* 返回应用程序类的唯一实例
*
* @param array $app_config
*
* @return MyApp
*/
static function instance(array $app_config = null)
{
static $instance;
if (is_null($instance))
{
if (empty($app_config))
{
die('INVALID CONSTRUCT APP');
}
$instance = new MyApp($app_config);
}
return $instance;
}
/**
* 返回应用程序基础配置的内容
*
* 如果没有提供 $item 参数,则返回所有配置的内容
*
* @param string $item
*
* @return mixed
*/
function config($item = null)
{
if ($item)
{
return isset($this->_app_config[$item]) ? $this->_app_config[$item] : null;
}
return $this->_app_config;
}
/**
* 根据运行时上下文对象,调用相应的控制器动作方法
*
* @param array $args
*
* @return mixed
*/
function dispatching(array $args = array())
{
// 构造运行时上下文对象
$context = QContext::instance();
// 获得请求对应的 UDI(统一目的地信息)
$udi = $context->requestUDI('array');
#IFDEF DEBUG
QLog::log('REQUEST UDI: ' . $context->UDIString($udi), QLog::DEBUG);
#ENDIF
// 检查是否有权限访问
if (!$this->authorizedUDI($this->currentUserRoles(), $udi))
{
// 拒绝访问
$response = $this->_on_access_denied();
}
else
{
// 确定控制器的类名称
// 控制器类名称 = 模块名_Controller_名字空间_控制器名
$module_name = $udi[QContext::UDI_MODULE];
if ($module_name != QContext::UDI_DEFAULT_MODULE && $module_name)
{
$dir = "{$this->_app_config['MODULE_DIR']}/{$module_name}/controller";
$class_name = "{$module_name}_controller_";
}
else
{
$dir = "{$this->_app_config['APP_DIR']}/controller";
$class_name = 'controller_';
}
$namespace = $udi[QContext::UDI_NAMESPACE];
if ($namespace != QContext::UDI_DEFAULT_NAMESPACE && $namespace)
{
$class_name .= "{$namespace}_";
$dir .= "/{$namespace}";
}
$controller_name = $udi[QContext::UDI_CONTROLLER];
$class_name .= $controller_name;
$filename = "{$controller_name}_controller.php";
do
{
// 载入控制器文件
try
{
if (!class_exists($class_name, false))
{
Q::loadClassFile($filename, array($dir), $class_name);
}
}
catch (Q_ClassNotDefinedException $ex)
{
$response = $this->_on_action_not_defined();
break;
}
catch (Q_FileNotFoundException $ex)
{
$response = $this->_on_action_not_defined();
break;
}
// 构造控制器对象
$controller = new $class_name($this);
$action_name = $udi[QContext::UDI_ACTION];
if ($controller->existsAction($action_name))
{
// 如果指定动作存在,则调用
$response = $controller->execute($action_name, $args);
}
else
{
// 如果指定动作不存在,则尝试调用控制器的 _on_action_not_defined() 函数处理错误
$response = $controller->_on_action_not_defined($action_name);
if (is_null($response))
{
// 如果控制器的 _on_action_not_defined() 函数没有返回处理结果
// 则由应用程序对象的 _on_action_not_defined() 函数处理
$response = $this->_on_action_not_defined();
}
}
} while (false);
}
if (is_object($response) && method_exists($response, 'execute'))
{
// 如果返回结果是一个对象,并且该对象有 execute() 方法,则调用
$response = $response->execute();
}
elseif ($response instanceof QController_Forward)
{
// 如果是一个 QController_Forward 对象,则将请求进行转发
$response = $this->dispatching($response->args);
}
// 其他情况则返回执行结果
return $response;
}
/**
* 将用户数据保存到 session 中
*
* @param mixed $user
* @param mixed $roles
*/
function changeCurrentUser($user, $roles)
{
$user['roles'] = implode(',', Q::normalize($
没有合适的资源?快使用搜索试试~ 我知道了~
qeephp 入门 example-todo-2009-06-18.zip下载
共41个文件
php:34个
yaml:3个
css:2个
3星 · 超过75%的资源 需积分: 9 42 下载量 6 浏览量
2009-11-02
16:06:00
上传
评论
收藏 36KB ZIP 举报
温馨提示
qeephp 入门 example-todo-2009-06-18.zip下载 qeephp 入门 example-todo-2009-06-18.zip下载
资源推荐
资源详情
资源评论
收起资源包目录
example-todo-2009-06-18.zip (41个子文件)
todo
_code
app
control
sidebar_view.php 2KB
sidebar.php 406B
pagination.php 4KB
myapp.php 16KB
view
tasks
index.php 1KB
create.php 201B
_layouts
default_layout.php 936B
403.php 1KB
redirect_message.php 540B
404.php 1KB
_elements
formview_simple_element.php 2KB
users
register.php 199B
model
user.php 6KB
task.php 6KB
form
userlogin_form.yaml 303B
changepasswd_form.yaml 327B
user.php 149B
task_form.yaml 194B
userlogin.php 438B
task.php 423B
changepasswd.php 1KB
controller
abstract.php 4KB
default_controller.php 453B
users_controller.php 4KB
tasks_controller.php 3KB
config
environment.yaml.php 2KB
database.yaml.php 399B
environments
deploy.yaml.php 919B
test.yaml.php 941B
devel.yaml.php 939B
app.yaml.php 317B
routes.yaml.php 1KB
acl.yaml.php 357B
boot.php 2KB
index.php 374B
_htaccess 125B
_tmp
runtime_cache
log
_devel
db
mysql_schema.sql 1KB
scripts
websetup.php 464B
generate.php 541B
media
formview_simple.css 1KB
style.css 4KB
共 41 条
- 1
资源评论
- 道6662012-11-05有个小bug!
- liu65811992012-03-19在注册和修改任务的代码有问题
java_cc
- 粉丝: 1
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功