一、单入口文件,一般为index.php, 一般做3件事:
1》在这个文件里一般不提供任何处理代码,只是可以预定义一些配置中的变量,覆盖框架中的配置
2》加载框架,创建应用
3》运行应用
二、加载框架的文件,要干的事:
1》定义开始时间常量 及 内存初始使用情况:YII_BEGIN_TIME MEMORY_LIMIT_ON
2》定义调试状态:YII_DEBUG
3》定义调试时显示的错误跟踪栈:YII_TRACE_LEVEL
4》定义是否能处理异常和错误:YII_ENABLE_EXCEPTION_HANDLER YII_ENABLE_ERROR_HANDLER
5》定义框架路径:YII_PATH
6》定义其他一些用到的常量
----------------------------------------
7》定义生成应用的类,在这个类中要干的事:
1:定义存储预加载的类映射$classMap = array(‘类名' => '类路径')
2:定义应用中用到的一些共有方法,如日志处理,性能分析,注册自动加载机制
三、框架目录机构规划
1》框架入口文件,如iWeb.php,提供创建应用,注册自动加载机制等
2》各功能模块单独存放在目录里:一般包括数据库处理DB,缓存处理Cache,语言处理Lang,日志处理Log, 国际化处理util,处理网站应用的Web(包括action,controller,model,view
四、对于一些重要的配置参数,在应用CApplication类中应该提供对其调用的接口函数
注意:虽然通过config.php可以直接通过键名获取,但是这样的话无法确保是否配置正确,单独写函数可以判断是否写的正确)如Yii中的CApplication设置 (private $_basePath;) 这个属性的方法(虽然在config配置中'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..')已经配置过了,但是提供接口可以确保是个有效的地址。
/** * Returns the root path of the application. * @return string the root directory of the application. Defaults to 'protected'. */ public function getBasePath() { return $this->_basePath; } /** * Sets the root directory of the application. * This method can only be invoked at the begin of the constructor. * @param string $path the root directory of the application. * @throws CException if the directory does not exist. */ public function setBasePath($path) {
//如果文件存在且是一个路径 if(($this->_basePath=realpath($path))===false || !is_dir($this->_basePath)) throw new CException(Yii::t('yii','Application base path "{path}" is not a valid directory.', array('{path}'=>$path))); }
三、使用一个常量或路径别名来代替长的路径配置
Yii中运用的: Yii::setPathOfAlias('application',$this->getBasePath()); Yii::setPathOfAlias('webroot',dirname($_SERVER['SCRIPT_FILENAME'])); Yii::setPathOfAlias('ext',$this->getBasePath().DIRECTORY_SEPARATOR.'extensions');
phpcms中运用的:
//PHPCMS框架路径
define('PC_PATH',dirname(__FILE__).DIRECTORY_SEPARATOR);
if(!defined('PHPCMS_PATH'))define('PHPCMS_PATH', PC_PATH.'..'.DIRECTORY_SEPARATOR);
//缓存文件夹地址
define('CACHE_PATH', PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR);
//主机协议
define('SITE_PROTOCOL',isset($_SERVER['SERVER_PORT']) &&$_SERVER['SERVER_PORT'] =='443' ? 'https://':'http://');
//当前访问的主机名
define('SITE_URL', (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] :''));
//来源
define('HTTP_REFERER',isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] :'')
四、处理前添加钩子处理
来自Yii中CApplication中的都__construct方法
$this->preinit(); //处理请求前添加钩子,预处理
$this->initSystemHandlers(); //预初始化一些事,如错误处理,exception处理
$this->registerCoreComponents();
$this->configure($config);
$this->attachBehaviors($this->behaviors);
$this->preloadComponents();
$this->init(); //处理请求后添加初始化方法
/**
* Initializes the class autoloader and error handlers.
*/
protected function initSystemHandlers()
{
if(YII_ENABLE_EXCEPTION_HANDLER)
set_exception_handler(array($this,'handleException'));
if(YII_ENABLE_ERROR_HANDLER)
set_error_handler(array($this,'handleError'),error_reporting());
}