W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
CodeIgniter支持代碼模塊化組合,以便于你構(gòu)建可重用的代碼。模塊通常來說是以一個特定主題為中心而構(gòu)建的,并可被認為是在大型的程序中的一系列微型程序。 我們支持框架中所有標準的文件類型,例如控制器,模型,視圖,配置文件,輔助函數(shù),語言文件等。模塊可能包含著或多或少的你所需要的以上這些類型中。
CodeIgniter所使用的模塊功能的核心組件來自于 與PSR4相適應的自動加載 。 雖然所有的代碼都可以使用PSR4的自動加載和命名空間,最主要的充分使用模塊優(yōu)勢的方式還是為你的代碼加上命名空間,并將其添加到 app/Config/Autoload.php 中,在 psr4
這節(jié)中。
舉例而言,比如我們需要維護一個在應用間復用的簡單的博客模塊。我們可能會創(chuàng)建一個帶有公司名(比如acme)的文件夾來保存所有的模塊。 我們可能會將其置于我們的 application 目錄旁邊,在主項目目錄下:
/acme // 新的模塊目錄
/application
/public
/system
/tests
/writable
打開 app/Config/Autoload.php 并將 Acme 命名空間加入到 psr4
數(shù)組成員中:
$psr4 = [
'Config' => APPPATH . 'Config',
APP_NAMESPACE => APPPATH, // 自定義命名空間
'App' => APPPATH, // 確保篩選器等組件可找到,
'Acme' => ROOTPATH.'acme'
];
當我們設(shè)置完以上流程后,就可以通過 Acme
命名空間來訪問 acme 目錄下的文件夾內(nèi)容。這已經(jīng)完成了80%的模塊工作所需要的內(nèi)容, 所以你可以通過熟悉命名空間來適應這種使用方式。這樣多種文件類型將會被自動掃描并在整個定義的命名空間中使用——這也是使用模塊的關(guān)鍵。
在模塊中的常見目錄結(jié)構(gòu)和主程序目錄類似:
/acme
/Blog
/Config
/Controllers
/Database
/Migrations
/Seeds
/Helpers
/Language
/en
/Libraries
/Models
/Views
當然了,不強制使用這樣的目錄結(jié)構(gòu),你也可以自定義目錄結(jié)構(gòu)來更好地符合你的模塊要求,去掉那些你不需要的目錄并增加一些新的目錄,例如實體(Entites),接口(Interfaces),倉庫(Repository)等。
很多情況下,你需要指名你所需要包含進來的文件的命名空間全稱,但是CodeIgniter可以通過配置自動發(fā)現(xiàn)的文件類型,來將模塊更方便地整合進你的項目中:
這些是在 app/Config/Modules.php 文件中配置的。
自動發(fā)現(xiàn)系統(tǒng)通過掃描所有在 Config/Autoload.php 中定義的PSR4類型的命名空間來實現(xiàn)對于目錄/文件的識別。
當我們回顧上面的 acme 命名空間時,需要進行一個小小的調(diào)整,使得文件被發(fā)現(xiàn): 每個命名空間中的“模塊”需要擁有自己獨立定義的命名空間。 Acme 需要被換成 AcmeBlog。當你的模塊文件夾確定下來后,如果我們要去找一個Routes文件,自動發(fā)現(xiàn)的流程就會去尋找 /acme/Blog/Config/Routes.php 以防在別的應用中進行了查找。
你可以開啟或關(guān)閉所有的系統(tǒng)中的自動發(fā)現(xiàn),通過 $enabled 類變量。False的話就會關(guān)閉所有的自動發(fā)現(xiàn),優(yōu)化性能,但卻會讓你的模塊可用性相對下降。
通過 $activeExplorers 選項,你可以明確哪些項目是自動發(fā)現(xiàn)的。如果這個項目不存在,就不會對它進行自動發(fā)現(xiàn)流程,而數(shù)組中的其他成員仍舊會被自動發(fā)現(xiàn)。
通過Composer安裝的包將會默認被自動發(fā)現(xiàn)。這只需要Composer識別所需要加載的命名空間是符合PSR4規(guī)范的命名空間,PSR0類型的命名空間將不會被發(fā)現(xiàn)。
如果在定位文件時,你不想掃描所有Composer已識別的的目錄,可以通過編輯 Config\Modules.php
中的 $discoverInComposer
變量來關(guān)閉這一功能:
public $discoverInComposer = false;
這節(jié)將會詳細介紹每種文件類型(控制器,視圖,語言文件等)以及在模塊中如果使用它們。其中的某些信息在用戶手冊中將會更為詳細地描述,不過在這里重新介紹一下以便了解全局的情況。
默認情況下, 路由 將會在模塊內(nèi)部自動掃描,而這一特性可在 Modules 配置文件中被關(guān)閉,如上所述。
注解
由于在當前域內(nèi)包含了路由文件,$routes
實例已經(jīng)被定義了,所以當你嘗試重新定義類的時候可能會引起錯誤。
在主 app/Controller 目錄下定義的控制器不會自動被URI路由自動調(diào)用,所以需要在路由文件內(nèi)部手動聲明:
// Routes.php
$routes->get('blog', 'Acme\Blog\Controllers\Blog::index');
為了減少不必要的輸入, group 路由特性(譯者注: 分組路由 </incoming/routing#分組路由> )是一個不錯的選擇:
$routes->group('blog', ['namespace' => 'Acme\Blog\Controllers'], function($routes)
{
$routes->get('/', 'Blog::index');
});
No special change is needed when working with configuration files. These are still namespaced classes and loaded with the new
command:
$config = new \Acme\Blog\Config\Blog();
Config files are automatically discovered whenever using the config() function that is always available.
遷移文件將通過定義的命名空間自動發(fā)現(xiàn)。所有命名空間里找到的遷移每次都會被自動運行。
種子文件可在CLI或其他種子文件里使用,只要提供了完整的命名空間名。如果通過CLI調(diào)用,就需要提供雙反斜杠定義的類名格式():
> php public/index.php migrations seed Acme\\Blog\\Database\\Seeds\\TestPostSeeder
當使用 helper()
方法時,輔助函數(shù)將會通過定義的命名空間自動定位。只要它存在于 Helpers 命名空間目錄下:
helper('blog');
當使用 lang()
方法時,語言文件是通過定義的命名空間來自動定位的。只要這個文件是遵循主程序目錄一樣的目錄結(jié)構(gòu)來放置的。
庫總是通過完全命名空間化的類名進行實例化,所以不需要額外的操作:
$lib = new \Acme\Blog\Libraries\BlogLib();
模型總是通過完全命名空間化的類名進行實例化,所以不需要額外的操作:
$model = new \Acme\Blog\Models\PostModel();
視圖文件可通過 視圖 文檔中所述的類命名空間進行加載:
echo view('Acme\Blog\Views\index');
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: