zoukankan      html  css  js  c++  java
  • yii执行原理

    应用执行流程:

    浏览器向服务器发送 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/jinhuawang76/tag/yii/

  • 相关阅读:
    ➡️➡️➡️IELTS reading by Simon on Bili
    lc0502
    lc0331
    lc0329
    lc0327
    lc0326
    lc0324
    lc0320
    lc0319
    lc0316
  • 原文地址:https://www.cnblogs.com/derrck/p/3398745.html
Copyright © 2011-2022 走看看