在《Yii分析4:run的执行》一文中,介绍了Yii的app在执行run()方法时的主要步骤,在处理请求的方法processRequest()中首先通过路由管理类(参考《Yii分析5:路由管理类》)获取这个请求的route,之后将这个route作为参数传递给方法runController,接下来我们就来看看这个runController是如何执行的。
RunController的代码比较简洁,很好的秉承Yii框架的特色:
public function runController($route)
{
//根据route创建Controller对象数组
if(($ca=$this->createController($route))!==null)
{
//包含controller对象和actionID
list($controller,$actionID)=$ca;
//TODO::这里是干什么用的
$oldController=$this->_controller;
$this->_controller=$controller;
//调用controller对象的初始化方法
$controller->init();
//使用actionID运行这个Controller
$controller->run($actionID);
$this->_controller=$oldController;
}
Else
//如果没有找到对应的Controller,跳转到404页面
throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".',
array('{route}'=>$route===''?$this->defaultController:$route)));
}
其实真正的核心处理是在createController,对于createController,我们着重需要了解的是下面的这段注释:
/**
* ……
* 这个方法以下面的顺序创建一个控制器
* 1. 如果第一个字段在controllerMap(初始配置)中,则使用对应的控制器配置来创建控制器
* 2.如果第一个字段是一个模块(module)ID,则使用相应的模块来创建控制器
* 3.如果通过上面两项均无法创建控制器,将会搜索controllerPath(根目录对应的controller文件夹)来创建对应的控制器。
* ……
*/
public function createController($route,$owner=null)
{
……
}
也就是说,对于一个aaaa/bbbb/cccc的路由,yii首先从config/main.php中定义的controllerMap去寻找是否有名为aaaa的controller,如果有,那么就已aaaa为controller进行创建,否则再去寻找是否有名为aaaa的模块,如果有,那么就使用aaaa模块的名为bbbb的controller进行创建,否则在protected/controllers下寻找是否有名为aaaa的controller。
创建完Controller之后,就进入具体Controller类的run方法了,即实际的运行函数。
分享到:
相关推荐
Yii护照 安装 :light_bulb: 这是展示如何安装软件包的好地方,请参见下文: 跑步 $ composer require inquid/yii-passport 用法 :light_bulb: 这是显示一些用法示例的好地方! 变更日志 请看看 。 贡献 请看看 。...
yii-进程锁 防止脚本的多个副本同时运行。 使用 composer.json依赖项: " happyproff/yii-processlock " : " * " 注册应用程序组件: 'components' => [ . . . , 'processLock' => [ 'class' => '...
yii2elfinder 感谢: : 感谢:zybodya 提供当前 yii 版本 yii2elfinder 介绍:旧版本无法使用,因为它完全不适用于最新的jquery版本! 所以除了行动,我不得不改变一切;) 这个扩展允许你将 ElFinder 文件管理...
yii-simplepie yii-simplepie 是用于解析 rss 提要的 yii 扩展: 简单派: simplepie 文档: 用法 在 yii 中安装扩展 下载所有文件并放入 yii 扩展文件夹,然后在 config/main.php 中添加以下代码 'simplepie' ...
yii2sly 这个扩展是惊人的 jquery 滑块“sly”的包装器,可以在这里找到: 请。 仔细查看所有插件选项,可以通过将它们添加到“clientOptions”参数来传递这些选项,如下所示。 可以在此处找到扩展的演示: 安装 ...
用于与支付的 api 配合使用的 Yii 组件 安装 从这个 github 存储库下载 yii-robokassa: cd protected/components git clone https://github.com/ladamalina/yii-robokassa.git 在 protected/config/main.php 中...
Yii-QA简介(此项目目前已不再维护)感谢选择Yii-QA,基于框架基础实现的问答程序。 #意识到目前的急性时间有限,无法管理太多的额外项目,我准备合并现有手上的项目,集成在一个项目中,感谢支持!!!!!!!请关注:...
Arshaw 的 FullCalendar jQuery 插件的 Yii 扩展 作者:Alexey Samoylov ( )。 要求 PHP 5.4 Yii 1.x 例子 全局组件配置示例: 'components' => [ 'fullcalendar' => [ 'class' => 'ext.yii-fullcalendar....
Yii 1 流日志 将 Yii 1 日志发送到 stdout/stderr - 创建用于与提供的 php-fpm/nginx Docker 堆栈一起使用 感谢 Haensel 为! 安装 通过作曲家安装: composer require neam/yii-streamlog:* 或者下载扩展,将src...
yii-seo Yii PHP 框架的搜索引擎优化。 用法 布局中 <?php Yii::app()->controller->widget( 'vendor.crisu83.yii-seo.widgets.SeoHead', array( 'httpEquivs' => array( 'Content-Type' => 'text/html; ...
Yii 框架的 CKEditor 小部件 简单的 Yii CKEditor 小部件。 CKEditor - 每个人的 WYSIWYG 编辑器。 小部件生成具有相同属性的 CHtml::activeTextArea。 使用 CKEditor 4+ 版本测试。 安装 将此小部件复制到扩展...
在 "yii-demo" 中,模型类通常继承自 ActiveRecord,可以直接执行 SQL 查询或使用 Active Record 的方法,如 `save()`, `delete()`, `find()` 等。 4. **表单处理**:Yii 提供了强大的表单处理能力,包括验证、提交...
yii2-swoole 为赋予 Yii2 框架协程异步能力而生。 后期开发会依赖 去实现功能,相信 Swoft 会是下一代优秀的框架。 此插件基于 swoole (v2.0) 底层实现的协程,改造 Yii2 的核心代码,使开发者无感知,以及在不改动...
让我们深入了解一下Yii框架的执行流程及其部分源码分析。 1. **程序结构及配置** Yii的项目结构通常包含以下关键部分: - `protected`:存放应用的核心代码,如模型、控制器、配置文件等。 - `runtime`:运行时...
在Yii2中集成Swoole,我们可以创建一个基于Swoole的Console应用程序,来执行那些需要异步执行的任务。 首先,我们来看`server.php`,这是Swoole服务器的启动脚本。在这个文件中,你需要配置Swoole服务器的各项参数...
yii2fullcalendar JQuery Fullcalendar Yii2扩展JQuery来自: ://arshaw.com/fullcalendar/版本4.0.2许可证MIT jQuery文档: //arshaw.com/fullcalendar/docs/ Yii2扩展,通过 可以在这里找到一个小样本:http: ...
在分析 Yii 源码时,我们首先要理解框架的基本结构和核心组件的工作原理。 1. **入口文件(index.php)**: 入口文件是每个 Web 应用程序的起点,对于 Yii 而言,`index.php` 文件是应用的入口。在这个文件中,Yii...
**Yii评论模块详解** Yii评论模块,名为"yii-commentator",是一款专为Yii框架设计的评论系统插件。Yii,作为一个高效的PHP框架,广泛应用于Web应用开发,而"yii-commentator"则为Yii框架提供了方便、灵活的评论...
Yii框架演示项目 [Yii Framework]是一个现代框架,旨在为您PHP应用程序奠定坚实的基础。 它旨在显示和测试所有Yii功能。 安装 您至少需要PHP 7.4。 克隆此存储库。 在项目根目录中运行composer update 。 运行./...