thinkphp學習筆記5—模塊化設計


1.模塊結構  

  完整的ThinkPHP用用圍繞模塊/控制器/操作設計,並支持多個入口文件盒多級控制。ThinkPHP默認PATHINFO模式,如下:

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

應用:由同一個入口文件訪問的項目稱為一個應用,在完整版的代碼中就是Application

模塊:一個應用下面可以包含多個模塊,每個模塊對應獨立的目錄,在完整版的代碼中有Admin,Home,Common,Runtime四個模塊

控制器:每個模塊下有多個控制器,放在Controller目錄里面,控制器對應一個單獨的php類文件

操作:在控制器中又可以包含多個操作方法,還可以邦東某個操作類,每個操作就是URL訪問的最小單元,這個有點迷惑,類不是方法,可以有返回值么?

 

2.模塊設計

模塊的目錄結構如下:

  1. Application 默認應用目錄(可以設置)
  2. ├─Common 公共模塊(不能直接訪問)
  3. ├─Home 前台模塊
  4. ├─Admin 后台模塊
  5. ├─... 其他更多模塊
  6. ├─Runtime 默認運行時目錄(可以設置)

模塊不是固定的,可以方便的刪除添加,但是一般Common,Runtime兩個不用刪除。

在模塊內部又可以包含配置,控制器,模型等目錄,結構如下:

  1. ├─Module 模塊目錄
  2. ├─Conf 配置文件目錄
  3. ├─Common 公共函數目錄
  4. ├─Controller 控制器目錄
  5. ├─Model 模型目錄
  6. ├─Logic 邏輯目錄(可選)
  7. ├─Service Service目錄(可選)
  8. ... 更多分層目錄可選
  9. └─View 視圖目錄

除了Common和Conf目錄之外,其他的可以靈活的添加和刪除。

Common模塊是一個公共模塊,訪問所有模塊之前都會首先加載這個公共模塊下的配置文件Conf/config.php和公共函數文件Common/function.php,但是沒有找到這個function.php文件,Common模塊本身不能通過URL直接訪問,公共模塊中的其他文件可以被其他模塊集成或者調用。此外公共模塊的位置可以通過COMMON_PATH常量改變,在入口文件中重新定義COMMON_PATH如下:

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

目錄結構變化如下

  1. www WEB部署目錄(或者子目錄)
  2. ├─index.php 入口文件
  3. ├─README.md README文件
  4. ├─Common 應用公共模塊目錄
  5. ├─Application 應用模塊目錄
  6. ├─Public 應用資源文件目錄
  7. └─ThinkPHP 框架目錄

我這里不是用define('COMMON_PATH','./Common/');生成的,而是define('COMMON_PATH','Common/');去掉了前面的./,生成目錄截圖如下:

這樣Application目錄下的Common目錄就沒有作用了。

 

3.自動生成模塊目錄

 3.2.2版本開始可以自動生成默認模塊和自動生成控制器和模型,例如現在要生成一個Admin模塊用於網站后台管理,可以在入口文件下面添加下面代碼

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

然后刷新就可以在Application目錄下面生成一個Admin目錄,並且在Controller目錄里面生成一個默認的控制器IndexController.Class.php文件,手冊中的注釋是綁定Admin模塊到當前入口文件,其實這句話的具體作用是:如果沒有應用下面沒有Admin這個模塊那么自動生成這個模塊並以此模塊作為入口文件,注意如果綁定的是Home這個模塊,而去訪問Admin這個目錄就會報錯的,http://Servername/thinkphp/index.php/Admin/Index,錯誤內容是:

無法加載控制器:Admin

還有一點,如果生成模塊之后我們刪除這句綁定,就沒有錯了,這樣可以隨便訪問任何模塊。

生成模塊之后我們還可以自動在模塊內生成控制器和模型文件,代碼如下:

define('BIND_MODULE','Admin');
define('BUILD_CONTROLLER_LIST','Index,User,Menu');

注意這兩句要一起執行,我測試發現如果開始執行第一句生成模塊,再加上后面一句生成控制器的時候是不成功的,要刪掉這個Admin目錄,然后執行,這樣會生成目錄然后再Controller目錄下生成控制器文件,這個有點傻瓜。

生成的控制器是繼承自Think\Controller下。也可以實用命令行來生成控制器,這里我在贅述。

同樣的道理也可以自動生成模型,代碼如下:

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';

同樣的,不能有先后順序,就是說這三句必須一起執行才有效,不能逐一執行。控制器繼承自Think\Model

據我觀察,如果沒有綁定模塊是會自動生成Home模塊並訪問這個模塊的

 

系統默認配置中是禁止訪問Common模塊和Runtime模塊,我們也可自己添加禁止訪問的模塊,代碼如下:

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

同樣也可設置可以訪問的模塊和默認模塊,代碼如下:

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

據我觀察,就算不設置默認模塊,ThinkPHP也會默認生成並訪問Home模塊。

如果項目比較簡單,還可以設置單模塊,代碼如下:

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

可以給相同的用用及模塊綁定多個入口,不同入口文件設置不同的應用模式和綁定模塊,代碼如下:

// 綁定Home模塊到當前入口文件
$_GET['m'] = 'Home'; 
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';

這樣就可以使用下面的路徑來訪問了http://Servername/thinkphp/home.php/Index

這個home.php里的內容和index.php內容一樣,也是一個入口文件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM