1. 应用程序统一入口文件 index.php
2.创建一个 web 应用并执行
CConsoleApplication, CWebApplication 都继承了 CApplication
初始化应用时,将配置文件的名字作为参数传递给应用的构造器
Tip|提示: 如果应用配置非常复杂,我们可以把它分割为若干文件,每个文件返回配置数组中的一部分。
然后,在主配置文件中,我们调用PHP的 include() 包含其余的配置文件并把它们合并为一个完整的配置数组
初始化应用要干的事情:
1. 设置 bashPath
2. 设置 别名
3. 通过 [CApplication::preinit()] 预初始化应用
4. 设置类的自动装载器和错误处理
5. 注册核心类组件
6. 加载应用配置
7. 通过 [CApplication::init()] 初始化应用:
注册应用行为;
载入静态应用组件
8. 触发 [onBeginRequest|CApplication::onBeginRequest] 事件
9. 处理用户请求
解析用户请求;
创建控制器;
运行控制器;
10. 触发 [onEndRequest|CApplication::onEndRequest] 事件
public function __construct($config=null)
{
Yii::setApplication($this);
// set basePath at early as possible to avoid trouble
if(is_string($config)) {
$config=require($config);
}
if(isset($config['basePath']))
{
$this->setBasePath($config['basePath']);
unset($config['basePath']);
}
else {
$this->setBasePath('protected');
}
Yii::setPathOfAlias('application',$this->getBasePath());
Yii::setPathOfAlias('webroot',dirname($_SERVER['SCRIPT_FILENAME']));
if(isset($config['extensionPath']))
{
$this->setExtensionPath($config['extensionPath']);
unset($config['extensionPath']);
}
else {
Yii::setPathOfAlias('ext',$this->getBasePath().DIRECTORY_SEPARATOR.'extensions');
}
if(isset($config['aliases']))
{
$this->setAliases($config['aliases']);
unset($config['aliases']);
}
$this->preinit();// 1.通过 [CApplication::preinit()] 预初始化应用;
$this->initSystemHandlers(); // 2.设置类的自动装载器和错误处理;
$this->registerCoreComponents(); // 3.注册核心类组件;
$this->configure($config); // 4.加载应用配置;
$this->attachBehaviors($this->behaviors);
$this->preloadComponents();
$this->init(); // 5.通过 [CApplication::init()] 初始化应用:
}
3.处理请求
前端控制器里面的 路由:
创建控制器:
方法控制器里的 路由:
创建方法:
选择是否加载filter:
有 filter 的情况:
public static function create($controller,$action,$filters)
{
$chain=new CFilterChain($controller,$action);
$actionID=$action->getId();
foreach($filters as $filter)
{
if(is_string($filter)) // filterName [+|- action1 action2]
{
if(($pos=strpos($filter,'+'))!==false || ($pos=strpos($filter,'-'))!==false)
{
$matched=preg_match("/\b{$actionID}\b/i",substr($filter,$pos+1))>0;
if(($filter[$pos]==='+')===$matched)
$filter=CInlineFilter::create($controller,trim(substr($filter,0,$pos)));
}
else
$filter=CInlineFilter::create($controller,$filter);
}
elseif(is_array($filter)) // array('path.to.class [+|- action1, action2]','param1'=>'value1',...)
{
if(!isset($filter[0]))
throw new CException(Yii::t('yii','The first element in a filter configuration must be the filter class.'));
$filterClass=$filter[0];
unset($filter[0]);
if(($pos=strpos($filterClass,'+'))!==false || ($pos=strpos($filterClass,'-'))!==false)
{
$matched=preg_match("/\b{$actionID}\b/i",substr($filterClass,$pos+1))>0;
if(($filterClass[$pos]==='+')===$matched)
$filterClass=trim(substr($filterClass,0,$pos));
else
continue;
}
$filter['class']=$filterClass;
$filter=Yii::createComponent($filter);
}
if(is_object($filter))
{
$filter->init();
$chain->add($filter);
}
}
return $chain;
运行 filter :
Filter 钩子:
不含 filter:
通过php反射处理action参数: