天天看點

thinkphp學習筆記5—子產品化設計無法加載控制器:Admin

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/');去掉了前面的./,生成目錄截圖如下:

thinkphp學習筆記5—子產品化設計無法加載控制器:Admin

這樣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内容一樣,也是一個入口檔案。

作者:

Tyler Ning

出處:

http://www.cnblogs.com/tylerdonet/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,如有問題,可以通過以下郵箱位址

[email protected]

 聯系我,非常感謝。