1.模塊化設計
一個完整的ThinkPHP應用基於模塊/控制器/操作設計,並且,如果有需要的話,可以支持多入口文件和多級控制器。
一個典型的URL訪問規則是(我們以默認的PATHINFO模式爲例說明,當然也可以支持普通的URL模式):
http://serverName/index.php(或者其他應用入口文件)/模塊/控制器/操作/[參數名/參數值...]
ThinkPHP3.2的應用可以支持切換到命令行訪問,如果切換到命令行模式下面的訪問規則是:
>php.exe index.php(或其它應用入口文件) 模塊/控制器/操作/[參數名/參數值...]
解釋下其中的幾個概念:
名稱 | 描述 |
應用 | 基於同一個入口文件訪問的項目我們稱之爲一個應用。 |
模塊 | 一個應用下面可以包含多個模塊,每個模塊在應用目錄下面都是一個獨立的子目錄。 |
控制器 | 每個模塊可以包含多個控制器,一個控制器通常體現爲一個控制器類。 |
操作 | 每個控制器類可以包含多個操作方法,也可能是綁定的某個操作類,每個操作是URL訪問的最小單元 |
模塊化設計的思想下面模塊是最重要的部分,模塊其實是一個包含配置文件、函數文件和MVC文件(目錄)的集合。
新版採用模塊化的設計架構,下面是一個應用目錄下面的模塊目錄結構,每個模塊可以方便的卸載和部署,並且支持公共模塊。
Application 默認應用目錄(可以設置) ├─Common 公共模塊(不能直接訪問) ├─Home 前臺模塊 ├─Admin 後臺模塊 ├─... 其他更多模塊 ├─Runtime 默認運行時目錄(可以設置)
每個模塊是相對獨立的,其目錄結構如下:
├─Module 模塊目錄 │ ├─Conf 配置文件目錄 │ ├─Common 公共函數目錄 │ ├─Controller 控制器目錄 │ ├─Model 模型目錄 │ ├─Logic 邏輯目錄(可選) │ ├─Service Service目錄(可選) │ ... 更多分層目錄可選 │ └─View 視圖目錄
由於採用多層的MVC機制,除了Conf和Common目錄外,每個模塊下面的目錄結構可以根據需要靈活設置和添加,所以並不拘泥於上面展現的目錄。
●公共模塊
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';
其應用目錄結構變成:
www WEB部署目錄(或者子目錄)
├─index.php 入口文件
├─README.md README文件
├─Common 應用公共模塊目錄
├─Application 應用模塊目錄
├─Public 應用資源文件目錄
└─ThinkPHP 框架目錄
定義之後,Application目錄下面就不再需要Common目錄了。
●自動生成模塊目錄
從3.2.2版本開始,可以支持自動生成默認模塊之外的模塊目錄以及批量生成控制器和模型類。
例如,如果我們需要生成一個Admin模塊用於後臺應用,在應用入口文件中定義如下:
// 綁定Admin模塊到當前入口文件
define('BIND_MODULE','Admin');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
然後訪問URL地址
http://serverName/index.php
就會生成Admin模塊的目錄,並生成一個默認的控制器類Admin\Controller\IndexController
。如果需要生成更多的控制器類,可以定義BUILD_CONTROLLER_LIST
常量,例如:
// 綁定Admin模塊到當前入口文件
define('BIND_MODULE','Admin');
define('BUILD_CONTROLLER_LIST','Index,User,Menu');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
訪問後會自動生成三個指定的控制器類:
Admin\Controller\IndexController
Admin\Controller\UserController
Admin\Controller\MenuController
注意:默認生成的控制器類都是繼承Think\Controller
,如果需要繼承其他的公共類需要另外調整。
如果在應用的公共配置文件中設置關閉了
APP_USE_NAMESPACE
的話,生成的控制器類則不會採用命名空間定義。
還可以自己手動調用Think\Build
類的方法來生成控制器類,例如:
// 生成Admin模塊的Role控制器類
// 默認類庫爲Admin\Controller\RoleController
// 如果已經存在則不會重新生成
\Think\Build::buildController('Admin','Role');
同樣,也可以定義BUILD_MODEL_LIST
支持生成多個模型類:
// 綁定Admin模塊到當前入口文件
define('BIND_MODULE','Admin');
define('BUILD_CONTROLLER_LIST','Index,User,Menu');
define('BUILD_MODEL_LIST','User,Menu');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
訪問會自動生成模型類:
Admin\Model\UserModelAdmin\Model\MenuModel
注意:默認生成的模型類都是繼承Think\Model
,如果需要繼承公共的模型類需要另外調整。
如果在應用的公共配置文件中設置關閉了
APP_USE_NAMESPACE
的話,生成的模型類則不會採用命名空間定義。
也可以自己手動調用Think\Build類的方法來生成模型類,例如:
// 生成Admin模塊的Role模型類
// 默認類庫爲Admin\Model\RoleModel
// 如果已經存在則不會重新生成
\Think\Build::buildModel('Admin','Role');
●禁止訪問模塊
3.2對模塊的訪問是自動判斷的,所以通常情況下無需配置模塊列表即可訪問,但可以配置禁止訪問的模塊列表(用於被其他模塊調用或者不開放訪問),默認配置中是禁止訪問Common
模塊和Runtime
模塊(Runtime目錄是默認的運行時目錄),我們可以增加其他的禁止訪問模塊列表:
// 設置禁止訪問的模塊列表
'MODULE_DENY_LIST' => array('Common','Runtime','Api'),
設置後,Api模塊不能通過URL直接訪問,事實上,可能我們只是在該模塊下面放置一些公共的接口文件,因此都是內部調用即可。
●設置訪問列表
如果你的應用下面模塊比較少,還可以設置允許訪問列表和默認模塊,這樣可以簡化默認模塊的URL訪問。
'MODULE_ALLOW_LIST' => array('Home','Admin','User'),
'DEFAULT_MODULE' => 'Home',
設置之後,除了Home、Admin和User模塊之外的模塊都不能被直接訪問,並且Home模塊是默認訪問模塊(可以不出現在URL地址)。
●單模塊設計
如果你的應用夠簡單,那麼也許僅僅用一個模塊就可以完成,那麼可以直接設置:
// 關閉多模塊訪問
'MULTI_MODULE' => false,
'DEFAULT_MODULE' => 'Home',
一旦關閉多模塊訪問後,就只能訪問默認模塊(這裏設置的是Home)。
單模塊設計後公共模塊依然有效。
●多入口設計
可以給相同的應用及模塊設置多個入口,不同的入口文件可以設置不同的應用模式或者綁定模塊。
例如,我們在index.php
文件的同級目錄新增一個home.php
入口文件,並綁定Home模塊:
// 綁定Home模塊到當前入口文件
define('BIND_MODULE','Home');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
綁定模塊後,原來的訪問地址
http://serverName/index.php/Home/Index/index
就變成
http://serverName/home.php/Index/index