文档章节

yii执行原理

Surjur
 Surjur
发布于 2015/07/13 17:34
字数 848
阅读 327
收藏 8

应用执行流程:

浏览器向服务器发送 Http Request
    |
  控制器(protected/controllers)
    |
    |---> Action
            |
         创建模型 (Model)
            |
         检查$_POST输入
            |
         渲染视图
            |
         render()第二个参数作为控制器与视图接口参数
            |
            |----> View (protected/views)
                     |
                   使用$this访问控制器的变量(包括layout, widget)



-----------------------------------------------------------------

视图渲染流程:

render($view, $data, $return)
    |
beforeRender()
    |
渲染View文件,调用renderPartial(),要求处理输出结果
    |
    |----> 根据$view得到viewFile文件名
                    |
           renderFile(),要求返回渲染结果,做下一步处理
                    |
                    |-----------> 获取widget的数目
                                         |
                                  从Yii::app()获得render
                                  CWebApplication::getViewRenderer
                                  查询component['viewRenderer'],默认没有配置
                                         |
                                  Then, 调用renderInternal()
                                         |
                                         |---------> require View文件,渲染,根据需要返回渲染结果
                                                          |
                                         |<---------------|
                                         |
                    |<-------------------|
                    |
               处理输出结果processOutput()
                    |
               按照caller参数,返回输出,而不是echo输出
    |<--------------|
    |
渲染layout文件
    |

----------------------------------------------------------------------

加载控制器及其方法:

根据route信息,获得当前控制器
      |
初始化当前控制器,CController::init(),默认为空
      |
执行当前控制器,CController::run()
      |
      |----> 创建action,为空则默认为index
                     |
             得到CInlineAction的实例
                     |
             用父对象执行beforeControllerAction:默认是CWebApplication,直接返回TRUE
                     |
                执行action
                     |----> 备份原来的action
                                 |
                            执行beforeAction()
                                 |
                            runWithParams()----> 实际上是执行CInlineAction->runWithParams()
                                                             |
                                                 在实例中,执行SiteController->actionIndex()
                                                             |
                                                 渲染页面:render('index')
                                                             |
                                 |<--------------------------|
                                 |
                            执行afterAction()
                                 |
                            恢复原来action
                                 |
                     |<----------|
                     |
             用父对象执行afterControllerAction:默认是CWebApplication,为空
       |<------------|
     完成


----------------------------------------------------------------

应用执行流程:

index.php
    |
require_once($yii)
    |
    |------------->yii.php
                    |
                  require(YiiBase.php)
                    |
                    |---------------->YiiBase.php
                                        |
                                      Define YII_XXX global variable
                                        |
                                      Define Class YiiBase
                                        |
                                      Autload Class YiiBase (自动加载类机制)
                                        |
                                      require interface.php
                                        |
                    |<------------------|
                    |
                   define null Class Yii
                    |
    |<--------------|
    |
createWebApplication($config)---------->|
                                        |
                                      YiiBase::createApplication('CWebApplication',$config)
                                        |
                                      Create Instance of CWebApplication
                                        |
                                        |--------->CWebApplication
                                                      |
                                                   CApplication($config)构造函数
                                                      |
                                                      |------>|
                                                           setBasePath
                                                              |
                                                           set path alias
                                                              | 
                                                           preinit() 空方法
                                                              | 
                                                           initSystemHandlers()
                                                              | 
                                                           configure($config) 将配置文件信息保存到Application
                                                              |
                                                           attachBehaviors()
                                                              | 
                                                           preloadComponents() --> 装载在configure($config)中配置需要preload的components
                                                              | 
                                                           init()                                                              | 
                                                      |<------|
                                                      |
                                        |<------------|
                                        |
    |<----------------------------------|
    |
app->run()
    |
    |---->CWebApplication::processRequest()
                      |
                      |----> CWebApplication::runController($route)
                                       |
                                       |---->createController($route)
                                                    |
                                                 如果$route是空,添加默认controller,对于CWebApplication的controller是"site"
                                                    |
                                                 Controller类是SiteController,require该类文件
                                                    |
                                                 如果该类是CController的子类,修改id[0]为大写,创建该类的实例
                                                    |
                                                    |---->CSiteController
                                                              |
                                                          extends from Controller 这是客户化控制器的基本类,存在于components下
                                                          定义了页面的通用布局
                                                              |
                                                          使用CController构造函数创建对象CSiteController,具体初始化数据见yii-1.png
                                                              |
                                                    |<--------|
                                                备份$this->_controller
                                                $this->_controller = $controller
                                                    |
                                                 调用控制器类的init()方法,默认为空
                                                    |
                                                 调用控制器类的run()方法,默认为CController的run()
                                                    |
                                                    |---->createAction()
                                                              |
                                                           if($actionID==='') $actionID设置为$this->default ("index")
                                                              |
                                                              |Yes
                                                              |----> return CInlineAction($this, $actionID)
                                                              |No              |
                                                           从Map创建           |
                                                              |      执行当前类CInlineAction的父类CAction的构造函数
                                                              |      设置_controller和$id
                                                              |                |
                                                              |<---------------|
                                                              |
                                                              |
                                                           这里得到一个CAction的实例
                                                              |
                                                           $this->getModule()作为parent,为空则使用Yii::ap
                                                              |
                                                           $parent->beforeControllerAction() ??
                                                              | 
                                                            $this->runActionWithFilters($action,$this->filters());
                                                              | 
                                                            $parent->afterControllerAction($this,$action);
                                                    |<--------|
                                                    |
                                                  恢复原来的$oldController
                                       |<-----------| 
                                       |
                       |<--------------|
                       |
                  End of processRequest()
                       |
    |<-----------------|
    |
End of app->run()

------------------------------------------------------------

获取控制器和方法的ID

转载:http://code.dimilow.com/how-to-get-current-controller-name-and-action-name-in-yii/


How to get current controller name and action name in Yii

By Dimi Low on July 7th, 2010 (6 responses)

To get current controller name/id inside your controller, or view
$controllerId = Yii::app()->controller->id;
//or
$controllerId = $this->getId();

To get current action name/id being executed, if you are inside beforeAction() or afterAction(), use the received CAction argument
//inside beforeAction or afterAction
public function beforeAction($action)
{
$actionId = $action->id;
...
or just elsewhere inside your controller
$actionId = $this->getAction()->getId();

 

----------------------------------------------------

 

使用YiiMailMessage发送邮件:

安装yii-mail到protected/extension下

配置protected/config/main.php,如下
'import' => array(
......
'application.extensions.yii-mail.*',
),

......
'components' => array(
'mail' => array(
'class' => 'application.extensions.yii-mail.YiiMail',
'transportType' => 'smtp', /// case sensitive!
'transportOptions' => array(
'host' => 'mail.syncomni.com',
'username' => 'huajian@syncomni.com',
// or email@googleappsdomain.com
'password' => 'Sitbwp4m2w',
// 'port' => '465',
// 'encryption' => 'ssl',
),
// 'viewPath' => 'application.views.mail',
'logging' => true,
'dryRun' => false
),
),
发送邮件
// 发送电子邮件
$message = new YiiMailMessage;
$message->setSubject($model->notice_subject);
$message->setBody($model->notice);
$message->setTo('kevin@syncomni.com');
$message->from = Yii::app()->params['adminEmail'];
Yii::app()->mail->send($message);

本文转载自:http://www.cnblogs.com/derrck/p/3398745.html

Surjur
粉丝 26
博文 193
码字总数 12053
作品 0
杭州
程序员
私信 提问
reids之YII常见使用问题

首先YII的框架包中并不含redis部分,需要自己配置和安装。 第一部分:Mac下YII框架的redis安装与配置 1.安装redis 方法一: 在没有安装YII的时候,可以通过修改composer的json文件实现修改安...

0_0Loong
2017/10/19
0
0
Yii2 源码分析 - 入口文件执行流程

以 yii 2.0.14 高级版的 frontend 为例,从 frontend/web/index.php 开始 入口文件看着就这么几行,简单的很,那他是怎么通过这几行来运行应用的呢?先看 Yii.php 内的逻辑 接下来,就是重头...

botkenni
2018/05/03
0
0
安装指南: 带有 RBAC 的 Yii2 高级模板

在这里我介绍一种快速简单的方法来在 Yii2 高级模版中安装 RBAC(Role Based Access Control) 系统 安装: Yii2 高级模板 在这里使用 安装 yii2 高级模板。假如你的机器中没有 请下载 它的最新...

首席烤地瓜
2016/11/10
17
0
Yii框架学习笔记(一)引入Yii框架

Yii Framework是一个基于组件、用于开发大型 Web 应用的高性能 PHP 框架。Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。Yii是最有效率的PHP框架之一。Yii是创始人薛强的心血结晶,于2...

flute小行
2014/04/11
0
0
yii2源码分析之执行基本流程

用yii2框架用了将近2年,一直都没有去看过它底层源码, 马上快不用了,最近对其源码研究一番,哈哈 废话少说,上代码, 入口文件是web/index.php

china_lx1
2018/04/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在工作中快速成长?致工程师的10个简单技巧

阿里妹导读:阿里有句非常经典的土话,“今天的最好表现,是明天的最低要求。”如何挖掘潜能、发现更好的自己?今天,阿里巴巴高级无线开发专家江建明将认知升级的方法总结出来,帮助你获得快...

阿里云云栖社区
28分钟前
1
0
PHP和Redis实现在高并发下的抢购及秒杀功能

抢购、秒杀是平常很常见的场景,面试的时候面试官也经常会问到,比如问你淘宝中的抢购秒杀是怎么实现的等等。 抢购、秒杀实现很简单,但是有些问题需要解决,主要针对两个问题: 一、高并发对...

xiaogg
29分钟前
0
0
从数据上看:谁才是漫威的绝对C位

复联4上映了!这次比美国还早了两天。当然,我还没看,不会给你们剧透,当然也不想不剧透。 这一部不仅是灭霸这一线剧情的结局,也被认为漫威第三阶段的收官之作。据说此部之后,不少影迷熟知...

crossin
43分钟前
3
0
Spring Cloud底层原理

毫无疑问,Spring Cloud 是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。 不过大多数讲解还停留在对 Spring Cloud 功能使用的层面,其底层的很多原理,很多人可能并不知晓。 ...

月下狼
52分钟前
5
0
Linux重启Tomcat

在测试过程中,要构建测试环境,还经常要重启Tomcat排查问题,重启Tomcat的步骤: 1、首先查看Tomcat是否有启动或重复启动? 输入命令ps -aux|grep java按回车键,可见下图,是有一个Tomcat启...

测试龙管家
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部