溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ThinkPHP學(xué)習(xí)筆記(五)模塊化設(shè)計(jì)

發(fā)布時(shí)間:2020-07-26 20:22:50 來源:網(wǎng)絡(luò) 閱讀:847 作者:elegant2008 欄目:web開發(fā)

1.模塊化設(shè)計(jì)

一個(gè)完整的ThinkPHP應(yīng)用基于模塊/控制器/操作設(shè)計(jì),并且,如果有需要的話,可以支持多入口文件和多級控制器。

一個(gè)典型的URL訪問規(guī)則是(我們以默認(rèn)的PATHINFO模式為例說明,當(dāng)然也可以支持普通的URL模式):

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

ThinkPHP3.2的應(yīng)用可以支持切換到命令行訪問,如果切換到命令行模式下面的訪問規(guī)則是:

    >php.exe index.php(或其它應(yīng)用入口文件) 模塊/控制器/操作/[參數(shù)名/參數(shù)值...]

解釋下其中的幾個(gè)概念:

名稱
描述
應(yīng)用
基于同一個(gè)入口文件訪問的項(xiàng)目我們稱之為一個(gè)應(yīng)用。
模塊一個(gè)應(yīng)用下面可以包含多個(gè)模塊,每個(gè)模塊在應(yīng)用目錄下面都是一個(gè)獨(dú)立的子目錄。
控制器
每個(gè)模塊可以包含多個(gè)控制器,一個(gè)控制器通常體現(xiàn)為一個(gè)控制器類。
操作

每個(gè)控制器類可以包含多個(gè)操作方法,也可能是綁定的某個(gè)操作類,每個(gè)操作是URL訪問的最小單元

模塊化設(shè)計(jì)的思想下面模塊是最重要的部分,模塊其實(shí)是一個(gè)包含配置文件、函數(shù)文件和MVC文件(目錄)的集合。

新版采用模塊化的設(shè)計(jì)架構(gòu),下面是一個(gè)應(yīng)用目錄下面的模塊目錄結(jié)構(gòu),每個(gè)模塊可以方便的卸載和部署,并且支持公共模塊。

    Application      默認(rèn)應(yīng)用目錄(可以設(shè)置)
    ├─Common         公共模塊(不能直接訪問)
    ├─Home           前臺(tái)模塊
    ├─Admin          后臺(tái)模塊
    ├─...            其他更多模塊
    ├─Runtime        默認(rèn)運(yùn)行時(shí)目錄(可以設(shè)置)

每個(gè)模塊是相對獨(dú)立的,其目錄結(jié)構(gòu)如下:

    ├─Module         模塊目錄
    │  ├─Conf        配置文件目錄
    │  ├─Common      公共函數(shù)目錄
    │  ├─Controller  控制器目錄
    │  ├─Model       模型目錄
    │  ├─Logic       邏輯目錄(可選)
    │  ├─Service     Service目錄(可選)
    │  ... 更多分層目錄可選
    │  └─View        視圖目錄

由于采用多層的MVC機(jī)制,除了Conf和Common目錄外,每個(gè)模塊下面的目錄結(jié)構(gòu)可以根據(jù)需要靈活設(shè)置和添加,所以并不拘泥于上面展現(xiàn)的目錄。

●公共模塊

Common模塊是一個(gè)特殊的模塊,是應(yīng)用的公共模塊,訪問所有的模塊之前都會(huì)首先加載公共模塊下面的配置文件(Conf/config.php)和公共函數(shù)文件(Common/function.php)。但Common模塊本身不能通過URL直接訪問,公共模塊的其他文件則可以被其他模塊繼承或者調(diào)用。

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

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

其應(yīng)用目錄結(jié)構(gòu)變成:

    www  WEB部署目錄(或者子目錄)
   ├─index.php       入口文件
   ├─README.md       README文件
   ├─Common          應(yīng)用公共模塊目錄
   ├─Application     應(yīng)用模塊目錄
   ├─Public          應(yīng)用資源文件目錄
   └─ThinkPHP        框架目錄    

定義之后,Application目錄下面就不再需要Common目錄了。

●自動(dòng)生成模塊目錄

3.2.2版本開始,可以支持自動(dòng)生成默認(rèn)模塊之外的模塊目錄以及批量生成控制器和模型類。

例如,如果我們需要生成一個(gè)Admin模塊用于后臺(tái)應(yīng)用,在應(yīng)用入口文件中定義如下:

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

然后訪問URL地址

    http://serverName/index.php

就會(huì)生成Admin模塊的目錄,并生成一個(gè)默認(rèn)的控制器類Admin\Controller\IndexController。如果需要生成更多的控制器類,可以定義BUILD_CONTROLLER_LIST常量,例如:

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

訪問后會(huì)自動(dòng)生成三個(gè)指定的控制器類:

    Admin\Controller\IndexController
   Admin\Controller\UserController
   Admin\Controller\MenuController

    注意:默認(rèn)生成的控制器類都是繼承Think\Controller,如果需要繼承其他的公共類需要另外調(diào)整。 如果在應(yīng)用的公共配置文件中設(shè)置關(guān)閉了 APP_USE_NAMESPACE的話,生成的控制器類則不會(huì)采用命名空間定義。

還可以自己手動(dòng)調(diào)用Think\Build類的方法來生成控制器類,例如:

    // 生成Admin模塊的Role控制器類
   // 默認(rèn)類庫為Admin\Controller\RoleController
   // 如果已經(jīng)存在則不會(huì)重新生成
   \Think\Build::buildController('Admin','Role');

同樣,也可以定義BUILD_MODEL_LIST支持生成多個(gè)模型類:

    // 綁定Admin模塊到當(dāng)前入口文件
   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';

訪問會(huì)自動(dòng)生成模型類:

    Admin\Model\UserModelAdmin\Model\MenuModel

    注意:默認(rèn)生成的模型類都是繼承Think\Model,如果需要繼承公共的模型類需要另外調(diào)整。 如果在應(yīng)用的公共配置文件中設(shè)置關(guān)閉了 APP_USE_NAMESPACE的話,生成的模型類則不會(huì)采用命名空間定義。

也可以自己手動(dòng)調(diào)用Think\Build類的方法來生成模型類,例如:

    // 生成Admin模塊的Role模型類
   // 默認(rèn)類庫為Admin\Model\RoleModel
   // 如果已經(jīng)存在則不會(huì)重新生成
   \Think\Build::buildModel('Admin','Role');

●禁止訪問模塊

3.2對模塊的訪問是自動(dòng)判斷的,所以通常情況下無需配置模塊列表即可訪問,但可以配置禁止訪問的模塊列表(用于被其他模塊調(diào)用或者不開放訪問),默認(rèn)配置中是禁止訪問Common模塊和Runtime模塊(Runtime目錄是默認(rèn)的運(yùn)行時(shí)目錄),我們可以增加其他的禁止訪問模塊列表:

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

設(shè)置后,Api模塊不能通過URL直接訪問,事實(shí)上,可能我們只是在該模塊下面放置一些公共的接口文件,因此都是內(nèi)部調(diào)用即可。

●設(shè)置訪問列表

如果你的應(yīng)用下面模塊比較少,還可以設(shè)置允許訪問列表和默認(rèn)模塊,這樣可以簡化默認(rèn)模塊的URL訪問。

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

設(shè)置之后,除了Home、Admin和User模塊之外的模塊都不能被直接訪問,并且Home模塊是默認(rèn)訪問模塊(可以不出現(xiàn)在URL地址)。

●單模塊設(shè)計(jì)

如果你的應(yīng)用夠簡單,那么也許僅僅用一個(gè)模塊就可以完成,那么可以直接設(shè)置:

    // 關(guān)閉多模塊訪問
   'MULTI_MODULE'          =>  false,
   'DEFAULT_MODULE'        =>  'Home',

一旦關(guān)閉多模塊訪問后,就只能訪問默認(rèn)模塊(這里設(shè)置的是Home)。

單模塊設(shè)計(jì)后公共模塊依然有效。

●多入口設(shè)計(jì)

可以給相同的應(yīng)用及模塊設(shè)置多個(gè)入口,不同的入口文件可以設(shè)置不同的應(yīng)用模式或者綁定模塊。

例如,我們在index.php文件的同級目錄新增一個(gè)home.php入口文件,并綁定Home模塊:

    // 綁定Home模塊到當(dāng)前入口文件
   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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI