TP框架每日手冊
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');
C函式讀取二維配置// 如果my_config尚未設定的話,則返回default_config字串 C('my_config',null,'default_config');
2.13動態配置
// 動態改變快取有效期 C('DATA_CACHE_TIME',60);
// 獲取已經設定的引數值 C('USER_CONFIG.USER_TYPE'); // 設定新的值 C('USER_CONFIG.USER_TYPE',1);
2.14擴充套件配置
擴充套件配置可以支援自動載入額外的自定義配置檔案,並且配置格式和專案配置一樣。擴充套件配置檔案 user.php 和 db.phpuser.php// 載入擴充套件配置檔案 'LOAD_EXT_CONFIG' => 'user,db',
<?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',
1.在index.php的同級目錄下新建一個admin.php3.1.8多入口設計
2.繫結admin模組3.訪問// 繫結Home模組到當前入口檔案 define('BIND_MODULE','Admin'); define('APP_PATH','./Application/'); require './ThinkPHP/ThinkPHP.php';
原來的訪問 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
3.4.3DriverThinkPHP的核心部分包括核心函式庫、慣例配置、核心類庫(包括基礎類和內建驅動及核心行為) 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 // 系統檢視類
在架構設計上更加強化了驅動的設計,替代了之前的引擎和模式擴充套件,並且改進了行為的設計,使 得框架整體更加靈活,並且由於在需要寫入資料的功能類庫中都採用了驅動化的設計思想,所以使得新的 框架能夠輕鬆滿足分散式部署的需求,對雲平臺的支援可以更簡單的實現了。 驅動包括 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系統標籤位
3.4.6核心行為系統核心提供的標籤位置包括(按照執行順序排列): 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);
核心行為位於 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('路由表示式','路由地址','傳入引數') 模組路由和全域性路由配置的區別在於,全域性路由的路由地址必須包含模組。 路由表示式 路由表示式包括規則路由和正則路由的定義表示式,只能使用字串
相關推薦
TP框架每日手冊
1.基礎1.1目錄結構thinkphp框架目錄1.2入口檔案1.3系統常量 1.4自動生成預設模板自動生成1.5模組設計每個模組是相對獨立的,其目錄結構如下:1.6控制器1.7命名規範2.配置 2018年3月26日記錄2.
PHP.25-TP框架商城應用實例-後臺1-添加商品功能、鉤子函數、在線編輯器、過濾XSS、上傳圖片並生成縮略圖
引用傳遞 none move 名稱 textarea 如果 library time fields 添加商品功能 1、創建商品控制器【C】 /www.test.com/shop/Admin/Controller/GoodsController.class.php
TP框架的小知識
模塊 vol 如果 span think nds ffffff 作用 extends 1.__MODULE__ 的作用是:會替換成當前模塊的URL地址 (View ,Common ,Controller,不含域名) 2.__PUBLIC__的作用:默認項目下的Public模
PHP.29-TP框架商城應用實例-後臺7-商品會員修改-頁面優化,多表數據更新
color 創建 判斷 插入數據 market 字段 鉤子 check image 商品表修改功能 1、頁面優化,類似添加頁面 1 <layout name="layout" /> 2 3 <div class="tab-div"&g
PHP.32-TP框架商城應用實例-後臺10-商品分類-需求分析、創建無限級商品分類,遞歸
創建 efault inno use creat -a his ati ida 商品管理需求分析 1、實現商品無限級分類管理【類似京東三級分類】 2、添加商品時要指定商品屬於一個主分類和多個擴展分類【擴展分類可以是其他主分類】 3、商品列表中可以根據分類搜索商品 a) 搜
PHP.39-TP框架商城應用實例-後臺16-商品屬性2-AJAX添加、刪除
false .ajax ucc 下標 peid query 添加 split nbsp 添加商品屬性 思路:根據【後臺15】類型表{id,type_name}與屬性表{id,attr_name,attr_type,attr_option_values,type_id}
PHP.40-TP框架商城應用實例-後臺17-商品屬性3-商品分類的修改與刪除
屬性表 into alt replace 後臺 ron nbsp explode 不存在 商品分類的修改 1、改表單Goods/edit.html,加下拉框 2、因為商品屬性修改涉及商品屬性表goods_attr{id,attr_value,attr_id,goods_
PHP.48-TP框架商城應用實例-後臺23-權限管理-權限驗證
商城 strong pre model 必須 查看 數據 parent col 權限驗證 1、登錄控制器 2、通過tp驗證碼類生成驗證碼圖片 3、在管理員模型增加登錄驗證規則 4、後臺中所有的控制器必須先登錄才能訪問 思路:在訪問任何一個控制器之前都判斷一個sess
tp框架---View視圖層---模板繼承(舉例說明)
組成 註冊 main lock head 如何 round 變化 重新 當我們做動態頁面時,我們會發現一個網站的頭部和尾部是相同的,那麽我們如何用tp框架來做模板呢 ? 先看一下註意事項: (1)每個區塊由<block></block>標簽組成 (2
TP框架調用ajax 以及分頁的引用
stat 之前 str 讀取 text 指向 spa 空間 ati thinkphp使用ajax和之前使用ajax的方法一樣,不同點在於之前的ajax中的url指向了一個頁面,而thinkphp裏面的url需要指向一個操作方法。 一、thinkphp使用ajax返回數據
關於TP框架的小知識
bsp ica 技術分享 url show 比較 處理 前端 相關操作 訪問入口文件後在application文件夾中會出現一些文件夾,其中的home文件夾是前端模塊,也可以在application文件夾中新建文件夾。home文件夾模塊中Conf文件夾的config配置
tp框架基礎
請求 四種 分組 用戶操作 結構 系統開發 index.php -1 dex 【MVC模式】 M:Model 數據模型層,負責數據操作 V:View 視圖層,負責顯示視圖 C:Controller 控制器,實現業務邏輯 【控制器訪問及路由解析】 通過url地址get參數找
tp框架數據查詢,增刪改
數據模型 數據查詢 數據庫 修改 limit 一個表 網址 執行 頁面 select()是數據模型的一個指定方法,可以獲得數據表的數據信息 返回一個二維數組信息,當前數據表的全部數據信息 $obj = D(); 創建對象 $obj -> select(
tp框架之Model類與命名空間
自動調用 toolbar dmi 系統常量 根目錄 復制代碼 php span main 1.獲取系統常量信息 public function shuchu() { var_dump(get_defined_constants());
tp框架的ajax驗證用戶姓名的比較
tp框架的ajax驗證用戶姓名的比較數據庫設計隨意設計吧 反正就是用戶可以存入就可以了!正文tp後臺方法簡化: //用戶驗證 function checknm($name){ $info = D(‘user‘)->where("user_name =‘$name‘")->fin
TP框架中的一些登錄代碼分享
驗證碼 names success user mod fun crypt config spl <?php namespace Admin\Controller;use Think\Controller;class LoginController extends Co
TP框架 商城前臺用戶註冊方法
是否 () 自動 layout url phone gin logout 根據 //註冊 public function register(){ if(IS_POST){ //接收數據 $data = I(‘post.‘); $model = D(‘User
TP框架裏面當訪問不存在的操作方法時讓其不顯示錯誤頁面
操作 pub 不顯示 public 錯誤 ech function 用戶 額外 當訪問空操作方法或者不存在的錯誤的操作方法的時候: 在該控制器頁面裏面寫一個 public function _empty(){ echo "您訪問的頁面有誤"; } 的
TP框架中多條件篩選
bsp family span pid 條件 uid type 宋體 spa $pid =I(‘pid‘); $year = I(‘year‘); $productType = I(‘productType‘);
TP框架中的M,D,C,A,I,S方法
邏輯 沒有 命名空間 官方 shmop 通用 匹配 xtend 包括 M方法 M實例化參數是數據庫的表名 //使用M方法實例化$User = M(‘User‘);//和用法$User = new /Think/Model (‘User‘);等效//執行其他的數據操作$Use