代碼模塊?
CodeIgniter 支持代碼模塊化組合,以便于你構(gòu)建可重用的代碼。模塊通常來說是以一個特定主題為中心而構(gòu)建的,并可被認(rèn)為是在大型的程序中的一系列微型程序。 我們支持框架中所有標(biāo)準(zhǔn)的文件類型,例如控制器,模型,視圖,配置文件,輔助函數(shù),語言文件等。模塊可能包含著或多或少的你所需要的以上這些類型中。
命名空間?
CodeIgniter所使用的模塊功能的核心組件來自于 與PSR4相適應(yīng)的自動加載 。
雖然所有的代碼都可以使用PSR4的自動加載和命名空間,最主要的充分使用模塊優(yōu)勢的方式還是為你的代碼加上命名空間,并將其添加到 app/Config/Autoload.php 中,在 psr4 這節(jié)中。
舉例而言,比如我們需要維護(hù)一個在應(yīng)用間復(fù)用的簡單的博客模塊。我們可能會創(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'
];
當(dāng)我們設(shè)置完以上流程后,就可以通過 Acme 命名空間來訪問 acme 目錄下的文件夾內(nèi)容。這已經(jīng)完成了80%的模塊工作所需要的內(nèi)容,
所以你可以通過熟悉命名空間來適應(yīng)這種使用方式。這樣多種文件類型將會被自動掃描并在整個定義的命名空間中使用——這也是使用模塊的關(guān)鍵。
在模塊中的常見目錄結(jié)構(gòu)和主程序目錄類似:
/acme
/Blog
/Config
/Controllers
/Database
/Migrations
/Seeds
/Helpers
/Language
/en
/Libraries
/Models
/Views
當(dāng)然了,不強(qiáng)制使用這樣的目錄結(jié)構(gòu),你也可以自定義目錄結(jié)構(gòu)來更好地符合你的模塊要求,去掉那些你不需要的目錄并增加一些新的目錄,例如實體(Entites),接口(Interfaces),倉庫(Repository)等。
自動發(fā)現(xiàn)?
很多情況下,你需要指名你所需要包含進(jìn)來的文件的命名空間全稱,但是CodeIgniter可以通過配置自動發(fā)現(xiàn)的文件類型,來將模塊更方便地整合進(jìn)你的項目中:
這些是在 app/Config/Modules.php 文件中配置的。
自動發(fā)現(xiàn)系統(tǒng)通過掃描所有在 Config/Autoload.php 中定義的PSR4類型的命名空間來實現(xiàn)對于目錄/文件的識別。
To make auto-discovery work for our Blog namespace, we need to make one small adjustment. Acme needs to be changed to Acme\Blog because each “module” within the namespace needs to be fully defined. Once your module folder path is defined, the discovery process would look for discoverable items on that path and should, for example, find the routes file at /acme/Blog/Config/Routes.php.
開啟/關(guān)閉自動發(fā)現(xiàn)?
你可以開啟或關(guān)閉所有的系統(tǒng)中的自動發(fā)現(xiàn),通過 $enabled 類變量。False的話就會關(guān)閉所有的自動發(fā)現(xiàn),優(yōu)化性能,但卻會讓你的模塊可用性相對下降。
明確目錄項目?
通過 $activeExplorers 選項,你可以明確哪些項目是自動發(fā)現(xiàn)的。如果這個項目不存在,就不會對它進(jìn)行自動發(fā)現(xiàn)流程,而數(shù)組中的其他成員仍舊會被自動發(fā)現(xiàn)。
自動發(fā)現(xiàn)與Composer?
通過Composer安裝的包將會默認(rèn)被自動發(fā)現(xiàn)。這只需要Composer識別所需要加載的命名空間是符合PSR4規(guī)范的命名空間,PSR0類型的命名空間將不會被發(fā)現(xiàn)。
如果在定位文件時,你不想掃描所有Composer已識別的的目錄,可以通過編輯 Config\Modules.php 中的 $discoverInComposer 變量來關(guān)閉這一功能:
public $discoverInComposer = false;
處理文件?
這節(jié)將會詳細(xì)介紹每種文件類型(控制器,視圖,語言文件等)以及在模塊中如果使用它們。其中的某些信息在用戶手冊中將會更為詳細(xì)地描述,不過在這里重新介紹一下以便了解全局的情況。
路由?
默認(rèn)情況下, 路由 將會在模塊內(nèi)部自動掃描,而這一特性可在 Modules 配置文件中被關(guān)閉,如上所述。
注解
由于在當(dāng)前域內(nèi)包含了路由文件, $routes 實例已經(jīng)被定義了,所以當(dā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.