ThinkPhp框架的結構和執行過程

1.基礎

    1.1目錄結構

thinkphp框架目錄


    1.2入口文件


    1.3系統常量

                     

    1.4自動生成

        默認模板

        自動生成


    1.5模塊設計

        每個模塊是相對獨立的,其目錄結構如下:

    1.6控制器

    1.7命名規範

2.配置

        2018年3月26日記錄

    2.1數組配置方式

    ThinkPHP框架中默認所有配置文件的定義格式均採用返回PHP數組的方式,格式爲:


    2.2配置方式ini

 

    2.3配置方式xml


    2.4配置方式yaml

    
2.5配置方式json


2.6配置加載

        慣例配置->應用配置->模式配置->調試配置->狀態配置->模塊配置->擴展配置->動態配置

    後面的會覆蓋之前的,配置的優先順序是從右向左
    2.7慣例配置

        慣例配置文件:ThinkPHP/Conf/convention.php

    相當於系統配置
    2.8應用配置

        公共模塊的配置:Application/Common/Conf/config.php

    應用配置文件也就是調用所有模塊之前都會首先加載的公共配置文件
    2.9模式配置

        爲應用模式(後面會有描述)單獨定義配置文件

        Application/Common/Conf/config_應用模式名稱.php (僅在運行該模式下面纔會加載)

    2.10調試配置

       如果開啓調試模式的話,則會自動加載框架的調試配置文件(位於 ThinkPHP/Conf/debug.php )

       和應用調試配置文件(位於 Application/Common/Conf/debug.php)

    2.11狀態配置

       define('APP_STATUS','office');
       那麼就會自動加載該狀態對應的配置文件(位於 Application/Common/Conf/office.php )
       define('APP_STATUS','home');
       那麼就會自動加載該狀態對應的配置文件(位於 Application/Common/Conf/home.php )。

    2.12讀取配置
    C('參數名稱')

        $model = C('URL_MODEL');
        // 由於配置參數不區分大小寫,因此下面的寫法是等效的
        // $model = C('url_model');

        // 如果my_config尚未設置的話,則返回default_config字符串
        C('my_config',null,'default_config');

    C函數讀取二維配置

    2.13動態配置

        // 動態改變緩存有效期
        C('DATA_CACHE_TIME',60);

        // 獲取已經設置的參數值
        C('USER_CONFIG.USER_TYPE');
        // 設置新的值
        C('USER_CONFIG.USER_TYPE',1);

    2.14擴展配置
    擴展配置可以支持自動加載額外的自定義配置文件,並且配置格式和項目配置一樣。
    擴展配置文件 user.php 和 db.php

        // 加載擴展配置文件
        'LOAD_EXT_CONFIG' => 'user,db',

    user.php

 

        <?php
        //用戶配置文件
        return array(
        'USER_TYPE' => 2, //用戶類型
        'USER_AUTH_ID' => 10, //用戶認證ID
        'USER_AUTH_TYPE' => 2, //用戶認證模式
        );

    2.15批量配置

        $config = array('WEB_SITE_TITLE'=>'ThinkPHP','WEB_SITE_DESCRIPTION'=>'開源PHP框架');
        C($config);

    2.16數據庫配置

        // 讀取數據庫中的配置(假設有一個config表用於保存配置參數)
        $config = M('Config')->getField('name,value');
        // config是一個關聯數組 鍵值就是配置參數 值就是配置值
        // 例如: array('config1'=>'val1','config2'=>'val2',...)
        C($config); // 合併配置參數到全局配置

        // 讀取合併到全局配置中的數據庫中的配置參數
        C('CONFIG1');
        // 動態改變配置參數(當前請求有效,不會自動保存到數據庫)
        C('CONFIG2','VALUE_NEW');

3.架構
3.1模塊化設計

    3.1.1模塊化        

通過網址http://serverName/index.php(或者其他應用入口文件)/模塊/控制器/操作/[參數名/參數值...]       

整體目錄

應用目錄

模塊目錄

    3.1.2公共模塊

         Common模塊是一個特殊的模塊,是應用的公共模塊,訪問所有的模塊之前都會首先加載公共模塊下面的
配置文件( Conf/config.php )和公共函數文件( Common/function.php)。但Common模塊本身不

能通過URL直接訪問,公共模塊的其他文件則可以被其他模塊繼承或者調用。

    公共模塊的位置可以通過COMMON_PATH常量改變,我們可以在入口文件中重新定義COMMON_PATH如下:

    define('COMMON_PATH','./Common/');
    define('APP_PATH','./Application/');
    require './ThinkPHP/ThinkPHP.php';

    3.1.3自動生成模塊模塊目錄

         1.綁定模塊

        // 綁定Admin模塊到當前入口文件
        define('BIND_MODULE','Admin');
        define('APP_PATH','./Application/');
        require './ThinkPHP/ThinkPHP.php';

    2.訪問

        http://serverName/index.php
        並且會默認生成index的控制器

    3.生成多個控制器

        // 綁定Admin模塊到當前入口文件
        define('BIND_MODULE','Admin');
        define('BUILD_CONTROLLER_LIST','Index,User,Menu');
        define('APP_PATH','./Application/');
        require './ThinkPHP/ThinkPHP.php';

    4.生成多個模型類

        // 綁定Admin模塊到當前入口文件
        define('BIND_MODULE','Admin');
        define('BUILD_MODEL_LIST','User,Menu');
        define('APP_PATH','./Application/');
        require './ThinkPHP/ThinkPHP.php';

    5.可以採用build方法進行生成

        // 生成Admin模塊的Role控制器類
        // 默認類庫爲Admin\Controller\RoleController
        // 如果已經存在則不會重新生成
        \Think\Build::buildController('Admin','Role');
        // 生成Admin模塊的Role模型類
        // 默認類庫爲Admin\Model\RoleModel
        // 如果已經存在則不會重新生成
        \Think\Build::buildModel('Admin','Role');

    3.1.4禁止訪問模塊

        // 設置禁止訪問的模塊列表
        'MODULE_DENY_LIST' => array('Common','Runtime','Api'),

    3.1.5設置訪問列表

       'MODULE_ALLOW_LIST' => array('Home','Admin','User'),
       'DEFAULT_MODULE' => 'Home',

3.1.6設置訪問列表       

       'MODULE_ALLOW_LIST' => array('Home','Admin','User'),
       'DEFAULT_MODULE' => 'Home',

3.1.7單模塊設計

       // 關閉多模塊訪問
      'MULTI_MODULE' => false,
      'DEFAULT_MODULE' => 'Home',

    3.1.8多入口設計

        1.在index.php的同級目錄下新建一個admin.php

    2.綁定admin模塊

        // 綁定Home模塊到當前入口文件
        define('BIND_MODULE','Admin');
        define('APP_PATH','./Application/');
        require './ThinkPHP/ThinkPHP.php';

    3.訪問

        原來的訪問
        http://serverName/index.php/Admin/Index/index
        會變成
        http://serverName/admin.php/Index/index

    3.2URL模式
    3.2.1大小寫
    'URL_CASE_INSENSITIVE' => true, 爲true的時候爲不區分
    3.2.2URL模式
    四種

3.2.3普通模式

     http://localhost/?m=home&c=user&a=login&var=value
    'VAR_MODULE' => 'module', // 默認模塊獲取變量
    'VAR_CONTROLLER' => 'controller', // 默認控制器獲取變量
    'VAR_ACTION' => 'action', // 默認操作獲取變量

3.2.4PATHINFO模式

    http://localhost/index.php/home/user/login/var/value/
    PATHINFO地址的前三個參數分別表示模塊/控制器/操作。
    // 更改PATHINFO參數分隔符
    'URL_PATHINFO_DEPR'=>'-',
    http://localhost/index.php/home-user-login-var-value

3.3多層MVC
3.3.1模型層

例如在某個項目設計中需要區分數據層、邏輯層、服務層等不同的模型層,我們可以在模塊目錄下面創建
Model 、 Logic 和 Service 目錄,把對用戶表的所有模型操作分成三層:
1. 數據層:Model/UserModel 用於定義數據相關的自動驗證和自動完成和數據存取接口
2. 邏輯層:Logic/UserLogic 用於定義用戶相關的業務邏輯
3. 服務層:Service/UserService 用於定義用戶相關的服務接口等

而這三個模型操作類統一都繼承Model類即可

實例:

    數據層: Home/Model/UserModel.class.php
    namespace Home\Model;
    use Think\Model;
    class UserModel extends Model{
    }
    邏輯層: Home/Logic/UserLogic.class.php
    namespace Home\Logic;
    use Think\Model;
    class UserLogic extends Model{
    }
    服務層: Home/Service/UserService.class.php
    namespace Home\Service;
    use Think\Model;
    class UserService extends Model{
    }
     
    D('User') //實例化UserModel
    D('User','Logic') //實例化UserLogic
    D('User','Service') //實例化UserService
    默認的模型層是Model,我們也可以更改設置,例如:
    'DEFAULT_M_LAYER' => 'Logic', // 更改默認的模型層名稱爲Logic
    更改之後,實例化的時候需要改成:
    D('User') //實例化UserLogic
    D('User','Model') //實例化UserModel
    D('User','Service') //實例化UserService

3.3.2視圖層

    視圖層由模板和模板引擎組成,在模板中可以直接使用PHP代碼,模板引擎的設計會在後面講述,通過驅
    動也可以支持其他第三方的模板引擎。視圖的多層可以簡單的通過目錄(也就是模板主題)區分,例如:
    View/default/User/add.html
    View/blue/User/add.html
    複雜一點的多層視圖還可以更進一步,採用不同的視圖目錄來完成,例如:
    view 普通視圖層目錄
    mobile 手機端訪問視圖層目錄

默認模板

    默認的視圖層是View目錄,我們可以調整設置如下:
    'DEFAULT_V_LAYER' => 'Mobile', // 默認的視圖層名稱更改爲Mobile
    非默認視圖層目錄的模板獲取需要使用T函數,後面會講到。

3.3.3控制器

    ThinkPHP的控制器層由核心控制器和業務控制器組成,核心控制器由系統內部的App類完成,負責應用
    (包括模塊、控制器和操作)的調度控制,包括HTTP請求攔截和轉發、加載配置等。業務控制器則由用戶
    定義的控制器類完成。多層業務控制器的實現原理和模型的分層類似,例如業務控制器和事件控制器:
    Controller/UserController //用於用戶的業務邏輯控制和調度
    Event/UserEvent //用於用戶的事件響應操作
    訪問控制器 Home/Controller/UserController.class.php 定義如下:
    namespace Home\Controller;
    use Think\Controller;
    class UserController extends Controller{
    }
    事件控制器 Home/Event/UserEvent.class.php 定義如下:
    namespace Home\Event;
    use Think\Controller;
    class UserEvent extends Controller{
    }
    UserController負責外部交互響應,通過URL請求響應,例如 http://serverName/User/index ,而
     
    本文檔使用 看雲 構建 - 31 -UserEvent 負責內部的事件響應,並且只能在內部調用:
    A('User','Event');
    默認的訪問控制器層是Controller,我們可以調整設置如下:
    'DEFAULT_C_LAYER' => 'Event', // 默認的控制器層名稱改爲Event

3.4CBD模式
3.4.1架構

    ThinkPHP引入了全新的CBD(核心Core+行爲Behavior+驅動Driver)架構模式

3.4.2Core

        ThinkPHP的核心部分包括核心函數庫、慣例配置、核心類庫(包括基礎類和內置驅動及核心行爲)
        ThinkPHP/Common/functions.php // 核心函數庫
        ThinkPHP/Conf/convention.php // 慣例配置文件
        ThinkPHP/Conf/debug.php // 慣例調試配置文件
        ThinkPHP/Mode/common.php // 普通模式定義文件
        ThinkPHP/Library/Think // 核心類庫包
        ThinkPHP/Library/Behavior // 系統行爲類庫
        ThinkPHP/Library/Think/App.class.php // 核心應用類
        ThinkPHP/Library/Think/Cache.class.php // 核心緩存類
        ThinkPHP/Library/Think/Controller.class.php // 基礎控制器類
        ThinkPHP/Library/Think/Db.class.php // 數據庫操作類
        ThinkPHP/Library/Think/Dispatcher.class.php // URL解析調度類
        ThinkPHP/Library/Think/Exception.class.php // 系統基礎異常類
        ThinkPHP/Library/Think/Hook.class.php // 系統鉤子類
        ThinkPHP/Library/Think/Log.class.php // 系統日誌記錄類
        ThinkPHP/Library/Think/Model.class.php // 系統基礎模型類
        ThinkPHP/Library/Think/Route.class.php // 系統路由類
        ThinkPHP/Library/Think/Storage.class.php // 系統存儲類
        ThinkPHP/Library/Think/Template.class.php // 內置模板引擎類
        ThinkPHP/Library/Think/Think.class.php // 系統引導類
        ThinkPHP/Library/Think/View.class.php // 系統視圖類

3.4.3Driver


        在架構設計上更加強化了驅動的設計,替代了之前的引擎和模式擴展,並且改進了行爲的設計,使
        得框架整體更加靈活,並且由於在需要寫入數據的功能類庫中都採用了驅動化的設計思想,所以使得新的
        框架能夠輕鬆滿足分佈式部署的需求,對雲平臺的支持可以更簡單的實現了。
        驅動包括
        ThinkPHP/Library/Think/Cache/Driver // 緩存驅動類庫
        ThinkPHP/Library/Think/Db/Driver // 數據庫驅動類庫
        ThinkPHP/Library/Think/Log/Driver // 日誌記錄驅動類庫
        ThinkPHP/Library/Think/Session/Driver // Session驅動類庫
        ThinkPHP/Library/Think/Storage/Driver // 存儲驅動類庫
        ThinkPHP/Library/Think/Template/Driver // 第三方模板引擎驅動類庫
        ThinkPHP/Library/Think/Template/TagLib // 內置模板引擎標籤庫擴展類庫

3.4.4Behavior

    行爲(Behavior)是ThinkPHP擴展機制中比較關鍵的一項擴展,行爲既可以獨立調用,也可以綁定到某
    個標籤(位)中進行偵聽。

3.4.5系統標籤位

        系統核心提供的標籤位置包括(按照執行順序排列):
        app_init 應用初始化標籤位
        module_check 模塊檢測標籤位(3.2.1版本新增)
        path_info PATH_INFO檢測標籤位
        app_begin 應用開始標籤位
        action_name 操作方法名標籤位
        action_begin 控制器開始標籤位
        view_begin 視圖輸出開始標籤位
        view_template 視圖模板解析標籤位
        view_parse 視圖解析標籤位
        template_filter 模板解析過濾標籤位
        view_filter 視圖輸出過濾標籤位
        view_end 視圖輸出結束標籤位
        action_end 控制器結束標籤位
        app_end 應用結束標籤位

        開發人員還可以在應用中添加自己的應用標籤,在任何需要攔截的位置添加
        如下代碼即可:
        // 添加my_tag 標籤偵聽
        \Think\Hook::listen('my_tag');
        方法第一個參數是要偵聽的標籤位,除此之外還可以傳入並且只接受一個參數,如果需要傳入多個參數,
        請使用數組。
        // 添加my_tag 標籤偵聽
        \Think\Hook::listen('my_tag',$params);

3.4.6核心行爲

    核心行爲位於 ThinkPHP/Behavior/ 目錄下面,框架核心內置的行爲包括如下:


3.4.7行爲定義

        自定義的擴展行爲可以放在覈心或者應用目錄,只要遵循命名空間的定義規則即可。
        行爲類的命名採用:
        行爲名稱(駝峯法,首字母大寫)+Behavior
        行爲類的定義方式如下:
        namespace Home\Behavior;
        class TestBehavior {
           // 行爲擴展的執行入口必須是run
           public function run(&$params){
           if(C('TEST_PARAM')) {
             echo 'RUNTEST BEHAVIOR '.$params;
           }
         }
        }
        行爲類必須定義執行入口方法 run ,由於行爲的調用機制影響,run方法不需要任何返回值,所有返回都通
        過引用返回。

3.4.8行爲綁定
 行爲定義好後需要綁定標籤

        我們需要在應用的行爲定義文件 tags.php 文件中進行行爲和標籤的位置定義,格式如下:
        return array(
        '標籤名稱1'=>array('行爲名1','行爲名2',...),
        '標籤名稱2'=>array('行爲名1','行爲名2',...),
        );

        標籤名稱包括我們前面列出的系統標籤和應用中自己定義的標籤名稱,比如你需要在app_init標籤位置定
        義一個 CheckLangBehavior 行爲類的話,可以使用:
        return array(
        'app_init'=>array('Home\Behavior\CheckLangBehavior'),
        );
        可以給一個標籤位定義多個行爲,行爲的執行順序就是定義的先後順序,例如:
        return array(
        'app_init'=>array(
        'Home\Behavior\CheckLangBehavior',
        'Home\Behavior\CronRunBehavior'
        ),
        );

    讀取順序

        默認情況下tags.php中定義的行爲會併入系統行爲一起執行,也就是說如果系統的行爲定義中app_init標
        籤中已經定義了其他行爲,則會首先執行系統行爲擴展中定義的行爲,然後再執行項目行爲中定義的行
        爲。例如: 系統行爲定義文件中定義了:
        'app_begin' => array(
        'Behavior\ReadHtmlCacheBehavior', // 讀取靜態緩存
        ),
        而應用行爲定義文件有定義:
        'app_begin' => array(
        'Home\Behavior\CheckModuleBehavior',
        'Home\Behavior\CheckLangBehavior',
        ),
        則最終執行到app_begin標籤(位)的時候,會依次執行:
        Library\Behavior\ReadHtmlCacheBehavior
        Home\Behavior\CheckModuleBehavior
        Home\Behavior\CheckLangBehavior

    覆蓋操作

        如果希望應用的行爲配置文件中的定義覆蓋系統的行爲定義,可以改爲爲如下方式:
        'app_begin' => array(
        'Home\Behavior\CheckModuleBehavior',
        'Home\Behavior\CheckLangBehavior',
        '_overlay' => true,
        ),

3.4.9單獨執行

        行爲的調用不一定要放到標籤才能調用,如果需要的話,我們可以在控制器中或者其他地方直接調用行
        爲。例如,我們可以把用戶權限檢測封裝成一個行爲類,例如:
        namespace Home\Behavior;
        use Think\Behavior;
        class AuthCheckBehavior extends Behavior {
        // 行爲擴展的執行入口必須是run
        public function run(&$return){
        if(C('USER_AUTH_ON')) {
        // 進行權限認證邏輯 如果認證通過 $return = true;
        // 否則用halt輸出錯誤信息
        }
        }
        }

        定義了AuthCheck行爲後,我們可以在控制器的_initialize方法中直接用下面的方式調用:
        B('Home\Behavior\AuthCheck');

3.5命名空間

    3.5.1簡述

        namespace Org\Util;
        class File {
        }
        其所在的路徑是 ThinkPHP/Library/Org/Util/File.class.php ,因此,如果我們實例化該類的話:
        $class = new \Org\Util\File();
        系統會自動加載 ThinkPHP/Library/Org/Util/File.class.php 文件

    3.5.2根命名空間

        例如,我們在Library目錄下面新增一個My根命名空間目錄,然後定義一個Test類如下:
        namespace My;
        class Test {
        public function sayHello(){
        echo 'hello';
        }
        }
        Test類保存在 ThinkPHP/Library/My/Test.class.php ,我們就可以直接實例化和調用:
        $Test = new \My\Test();
        $Test->sayHello();

3.6自動加載

    3.6.1新的自動加載

        'AUTOLOAD_NAMESPACE' => array(
        'My' => THINK_PATH.'My',
        'One' => THINK_PATH.'One',
        )
        配置了上面的 AUTOLOAD_NAMESPACE 後,如果我們實例化下面的類庫
        new \My\Net\IpLocation();
        new \One\Util\Log();
        會自動加載對應的類庫文件
        ThinkPHP/My/Net/IpLocation.class.php
        ThinkPHP/One/Util/Log.class.php

    3.6.2類庫映射

        命名類庫映射相當於給類文件定義了一個別名,效率會比命名空間定位更高效,例如:
        Think\Think::addMap('Think\Log',THINK_PATH.'Think\Log.php');
        Think\Think::addMap('Org\Util\Array',THINK_PATH.'Org\Util\Array.php');
        注意:添加類庫映射的時候不需要寫類庫開頭的"\"
        也可以利用addMap方法批量導入類庫映射定義,例如:
        $map = array('Think\Log'=>THINK_PATH.'Think\Log.php','Org\Util\Array'=>THINK_PATH.'Org\Util\Ar
        ray.php');
        Think\Think::addMap($map);
        當然,比較方便的方式是我們可以在模塊配置目錄下面創建alias.php文件用於定義類庫映射,該文件會自
        動加載,定義方式如下:
        return array(
        'Think\Log' => THINK_PATH.'Think\Log.php',
        'Org\Util\Array' => THINK_PATH.'Org\Util\Array.php'
        );

    3.6.3自動加載的優先級

        1. 判斷是否有註冊了Test\MyClass類庫映射,如果有則自動加載類庫映射定義的文件;
        2. 判斷是否存在Library/Test目錄,有則以該目錄爲初始目錄加載;
        3. 判斷是否有註冊Test根命名空間,有則以註冊的目錄爲初始目錄加載;
        4. 如果以上都不成立,則以Test爲模塊目錄進行初始目錄加載;

    3.6.4手動加載
    各種方式加載

        // 導入Org類庫包 Library/Org/Util/Date.class.php類庫
        import("Org.Util.Date");
        // 導入Home模塊下面的 Application/Home/Util/UserUtil.class.php類庫
        import("Home.Util.UserUtil");
        // 導入當前模塊下面的類庫
        import("@.Util.Array");
        // 導入Vendor類庫包 Library/Vendor/Zend/Server.class.php
        import('Vendor.Zend.Server');

        如果你在Library目錄下面創建了一
        個Test子目錄,並且創建了一個UserTest.class.php類庫,那麼可以這樣導入:
        import('Test.UserTest');
        其他的就認爲是應用類庫導入。

        注意,如果你的類庫沒有使用命名空間定義的話,實例化的時候需要加上根命名空間,例如:
        import('Test.UserTest');
        $test = new \UserTest();

    當前文件目錄的

        例如,要導入當前文件所在目錄下面的
        RBAC/AccessDecisionManager.class.php 文件,可以使用:
        import("RBAC.AccessDecisionManager",dirname(__FILE__));
        如果你要導入的類庫文件名的後綴不是class.php而是php,那麼可以使用import方法的第三個參數指定後綴:
        import("RBAC.AccessDecisionManager",dirname(__FILE__),".php");

    導入點號

    名字中如果有三個或者三個以上的.的說話,就採用#的方式

        按照系統的規則,import方法是無法導入具有點號的類庫文件的,因爲點號會直接轉化成斜線,例如我們
        定義了一個名稱爲User.Info.class.php 的文件的話,採用:
        import("Org.User.Info");
        方式加載的話就會出現錯誤,導致加載的文件不是Org/User.Info.class.php 文件,而是
        Org/User/Info.class.php 文件,這種情況下,我們可以使用:
        import("Org.User#Info");

3.7應用模式

        默認情況下的應用模式是普通模式(common),如果要採用其他的應用模式(當然,前提是已經有定
        義),必須在入口文件中定義,設置 APP_MODE 常量即可,例如:
        // 定義存儲類型和應用模式爲SAE(用於支持SAE平臺)
        define('STORAGE_TYPE','sae');
        define('APP_MODE','sae');
        define('APP_PATH','./Application/');
        require './ThinkPHP/ThinkPHP.php';

3.8項目編譯

    3.8.1應用編譯緩存

        編譯緩存的基礎原理是第一次運行的時候把核心需要加載的文件去掉空白和註釋後合併到一個文件中,第
        二次運行的時候就直接載入編譯緩存而無需載入衆多的核心文件。當第二次執行的時候就會根據當前的應
        用模式直接載入編譯過的緩存文件,從而省去很多IO開銷,加快執行速度。

    例子:

        編譯緩存文件默認生成在應用目錄的Runtime目錄下面,我們可以在Application/Runtime目錄下面看到
        有一個 common~runtime.php 文件,這個就是普通模式的編譯緩存文件。如果你當前運行在其他的應用
        模式下面,那麼編譯緩存文件就是: 應用模式名~runtime.php
        ThinkPHP3.2.3完全開發手冊
        本文檔使用 看雲 構建 - 44 -例如,如果你當前用的是SAE模式,那麼生成的編譯緩存文件則會變成 sae~runtime.php 。
        普通模式的編譯緩存的內容包括:系統函數庫、系統基礎核心類庫、核心行爲類庫、項目函數文件,當
        然這些是可以改變的。

    3.8.2運行Lite文件

        運行Lite文件的作用是替換框架的入口文件或者替換應用入口文件,提高運行效率。因爲默認生成的文件
        名爲lite.php,並且是運行時動態生成,因此稱之爲運行Lite文件。
        Lite文件的特點包括:
            運行時動態生成;
            常量定義爲針對當前環境;
            支持定義需要編譯的文件列表;
            支持生成Lite文件的名稱;

3.9系統流程

        ThinkPHP框架開發的應用的標準執行流程如下:
        1. 用戶URL請求
        2. 調用應用入口文件(通常是網站的index.php)
        3. 載入框架入口文件(ThinkPHP.php)
        4. 記錄初始運行時間和內存開銷
        5. 系統常量判斷及定義
        6. 載入框架引導類(Think\Think)並執行Think::start方法進行應用初始化
        7. 設置錯誤處理機制和自動加載機制
        8. 調用Think\Storage類進行存儲初始化(由STORAGE_TYPE常量定義存儲類型)
        9. 部署模式下如果存在應用編譯緩存文件則直接加載(直接跳轉到步驟22)
        10. 讀取應用模式(由APP_MODE常量定義)的定義文件(以下以普通模式爲例說明)
        11. 加載當前應用模式定義的核心文件(普通模式是 ThinkPHP/Mode/common.php)
        12. 加載慣例配置文件(普通模式是 ThinkPHP/Conf/convention.php)
        13. 加載應用配置文件(普通模式是 Application/Common/Conf/config.php)
        14. 加載系統別名定義
        15. 判斷並讀取應用別名定義文件(普通模式是 Application/Common/Conf/alias.php)
        16. 加載系統行爲定義
        17. 判斷並讀取應用行爲定義文件(普通模式是 Application/Common/Conf/tags.php)
        ThinkPHP3.2.3完全開發手冊
        本文檔使用 看雲 構建 - 45 -18. 加載框架底層語言包(普通模式是 ThinkPHP/Lang/zh-cn.php)
        19. 如果是部署模式則生成應用編譯緩存文件
        20. 加載調試模式系統配置文件(ThinkPHP/Conf/debug.php)
        21. 判斷並讀取應用的調試配置文件(默認是 Application/Common/Conf/debug.php)
        22. 判斷應用狀態並讀取狀態配置文件(如果APP_STATUS常量定義不爲空的話)
        23. 檢測應用目錄結構並自動生成(如果CHECK_APP_DIR配置開啓並且RUNTIME_PATH目錄不存在的情
        況下)
        24. 調用Think\App類的run方法啓動應用
        25. 應用初始化(app_init)標籤位偵聽並執行綁定行爲
        26. 判斷並加載動態配置和函數文件
        27. 調用Think\Dispatcher::dispatch方法進行URL請求調度
        28. 自動識別兼容URL模式和命令行模式下面的$_SERVER['PATH_INFO']參數
        29. 檢測域名部署以及完成模塊和控制器的綁定操作(APP_SUB_DOMAIN_DEPLOY參數開啓)
        30. 分析URL地址中的PATH_INFO信息
        31. 獲取請求的模塊信息
        32. 檢測模塊是否存在和允許訪問
        33. 判斷並加載模塊配置文件、別名定義、行爲定義及函數文件
        34. 判斷並加載模塊的動態配置和函數文件
        35. 模塊的URL模式判斷
        36. 模塊的路由檢測(URL_ROUTER_ON開啓)
        37. PATH_INFO處理(path_info)標籤位偵聽並執行綁定行爲
        38. URL後綴檢測(URL_DENY_SUFFIX以及URL_HTML_SUFFIX處理)
        39. 獲取當前控制器和操作,以及URL其他參數
        40. URL請求調度完成(url_dispatch)標籤位偵聽並執行綁定行爲
        41. 應用開始(app_begin)標籤位偵聽並執行綁定行爲
        42. 調用SESSION_OPTIONS配置參數進行Session初始化(如果不是命令行模式)
        43. 根據請求執行控制器方法
        44. 如果控制器不存在則檢測空控制器是否存在
        45. 控制器開始(action_begin)標籤位偵聽並執行綁定行爲
        46. 默認調用系統的ReadHtmlCache行爲讀取靜態緩存(HTML_CACHE_ON參數開啓)
        47. 判斷並調用控制器的_initialize初始化方法
        48. 判斷操作方法是否存在,如果不存在則檢測是否定義空操作方法
        49. 判斷前置操作方法是否定義,有的話執行
        50. Action參數綁定檢測,自動匹配操作方法的參數
        51. 如果有模版渲染(調用控制器display方法)
        52. 視圖開始(view_begin)標籤位偵聽並執行綁定行爲
        53. 調用Think\View的fetch方法解析並獲取模版內容
        54. 自動識別當前主題以及定位模版文件
        55. 視圖解析(view_parse)標籤位偵聽並執行綁定行爲
        ThinkPHP3.2.3完全開發手冊
        本文檔使用 看雲 構建 - 46 -56. 默認調用內置ParseTemplate行爲解析模版(普通模式下面)
        57. 模版引擎解析模版內容後生成模版緩存
        58. 模版過濾替換(template_filter)標籤位偵聽並執行綁定行爲
        59. 默認調用系統的ContentReplace行爲進行模版替換
        60. 輸出內容過濾(view_filter)標籤位偵聽並執行綁定行爲
        61. 默認調用系統的WriteHtmlCache行爲寫入靜態緩存(HTML_CACHE_ON參數開啓)
        62. 調用Think\View類的render方法輸出渲染內容
        63. 視圖結束(view_end)標籤位偵聽並執行綁定行爲
        64. 判斷後置操作方法是否定義,有的話執行
        65. 控制器結束(action_end)標籤位偵聽並執行綁定行爲
        66. 應用結束(app_end)標籤位偵聽並執行綁定行爲
        67. 執行系統的ShowPageTrace行爲(SHOW_PAGE_TRACE參數開啓並且不是AJAX請求)
        68. 日誌信息存儲寫入

4.路由

    4.1簡介

        ThinkPHP的路由功能包括:
            正則路由
            規則路由
            靜態路由(URL映射)
            閉包支持

    開啓路由

        // 開啓路由
        'URL_ROUTER_ON' => true,

    路由規則

        'URL_ROUTE_RULES'=>array(
        'news/:year/:month/:day' => array('News/archive', 'status=1'),
        'news/:id' => 'News/read',
        'news/read/:id' => '/news/:1',
        ),

    4.2路由定義

        路由規則的定義格式爲: '路由表達式'=>'路由地址和傳入參數'
        或者:array('路由表達式','路由地址','傳入參數')
        模塊路由和全局路由配置的區別在於,全局路由的路由地址必須包含模塊。
        路由表達式
        路由表達式包括規則路由和正則路由的定義表達式,只能使用字符串


---------------------
作者:樂樂
來源:CSDN
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章