为YII框架的源代码分析控制器的创作

使用Yii框架的URL路径一般是什么样的主机名 / / R = XXXX XXXX / xxxxsdfs = dsfdsf

我们可以看到,有时我们使用受保护目录下的控制器,有时我们使用模块中的控制器,以及如何处理它。

下面的代码是从Yii框架核心代码为yiiroot % / / / CWebApplication.php网页框架
复制代码代码如下所示:
=================================================================================================
/ / 1.runcontroller是执行控制器的方式,美元和路线_get美元{ R'}
公共功能runcontroller($路线)
{
/ /这里叫createcontroller创建控制器的一个实例,所以createController选择控制器的关键
如果(($ CA =美元-> createcontroller(合路))!= NULL)
{
列表($控制器,actionid美元)= $ CA;
oldcontroller美元=美元-> _controller;
美元-> _controller = $控制器;
$控制器> init();
$控制器->运行($ actionid);
美元-> _controller = $ oldcontroller;
}
其他的
把新的chttpexception(404,Yii::T('yii,无法解决请求{ }路线,
阵列({ }路线路线= = = = >美元的美元-> defaultcontroller:$路线))))
}
==================================================================================================
2。然后我们分析createcontroller,假设路径访问网站/联系我们
公共功能createcontroller(合路线,美元业主= null)
{
第一次进入这个函数时,$所有者参数为null。
如果($所有者= NULL)
$所有者= $;
如果没有$路由参数 ,则使用默认控制器
如果((路径=修剪(路径))==)
美元美元路线=所有者> defaultcontroller;
美元美元-> geturlmanager CaseSensitive =()->区分大小写;
为了完成下面的运行周期,添加一个。
路由=;
将$位置放在POS机中
而(($ POS = strpos($ = =假路线,))!)
{
$ id是上半部分,也就是站点。
$id = substr($ 0美元的路线,POS);
如果(!preg_match( / ^ W + $ /,$id))
返回null;
如果(!为区分大小写)
$id = strtolower($id);
路由转为下半部分,即联系人。
$路线=(字符串)substr(合路线,POS机+ 1美元);
控制器根目录或子目录前缀
如果(!isset($修改表情)) / /第一段
{
第一次输入,$所有者是空的,而不是成员变量。
首次进入或$所有者价值,它可以设置成员变量,看到cwebmodule类
如果(isset($老板-> controllermap { $id }))
{
返回的数组(
Yii::createcomponent($老板-> controllermap { }美元美元美元的ID,ID,老板= = = thisnull美元:美元的所有者),
美元-> parseactionparams($路线),
);
}
如果我可以 / /一个独立的模块,通过getmodule方法,然后再打电话给createcontroller,网站是适合的模块的名称,指的是保护 / / main.php config配置文件,比如你的控制器在Webroot % /保护/模块/网站/控制器 / contactcontroller.php
如果(($模块=所有者> getmodule美元($id))!= NULL)
返回这个-> createcontroller(美元的路线,为模块);
控制器的目录:
/ / CWebApplication,相应的配置'basepath'} {(见配置文件)。 / /控制器,如控制器% Webroot % /保护/控制器/ sitecontroller.php
/ / C界面模块的一个子类,对应的子类。 /控制/文件夹,如你的控制器在Webroot % /保护/模块/网站/控制器/ contactcontroller.php
$basePath=$owner->getControllerPath ();
$controllerID='';
}
其他的
controllerid美元。=/;
美元ucfirst classname =($id)。'controller;
类文件修改表情=美元美元美元。directory_separator。类名。。php;
/ / if $classFile exists, according to the controller class file path obtained above, create an instance of the class
/ /如果它不存在,是控制器的子目录,找到控制器的周期结束,如你的控制器在Webroot % /保护/ / / sitecontroller somedir控制器
如果(is_file(合类文件))
{
如果(!class_exists($ className,假))
要求(合类文件);
如果(class_exists($ className,false)is_subclass_of($类名,'ccontroller '))
{
$id { 0 } = strtolower($id { 0 });
返回的数组(
新的类名(controllerid美元美元美元。美元= = =所有者身份,thisnull美元:美元的所有者),
美元-> parseactionparams($路线),
);
}
返回null;
}
controllerid美元。= $ ID;
修改表情美元。= directory_separator美元的ID;
}
}