代碼模塊?
CodeIgniter 支持代碼模塊化組合,以便于你構建可重用的代碼。模塊通常來說是以一個特定主題為中心而構建的,并可被認為是在大型的程序中的一系列微型程序。 我們支持框架中所有標準的文件類型,例如控制器,模型,視圖,配置文件,輔助函數,語言文件等。模塊可能包含著或多或少的你所需要的以上這些類型中。
命名空間?
CodeIgniter所使用的模塊功能的核心組件來自于 與PSR4相適應的自動加載 。
雖然所有的代碼都可以使用PSR4的自動加載和命名空間,最主要的充分使用模塊優勢的方式還是為你的代碼加上命名空間,并將其添加到 app/Config/Autoload.php 中,在 psr4
這節中。
舉例而言,比如我們需要維護一個在應用間復用的簡單的博客模塊。我們可能會創建一個帶有公司名(比如acme)的文件夾來保存所有的模塊。 我們可能會將其置于我們的 application 目錄旁邊,在主項目目錄下:
/acme // 新的模塊目錄
/application
/public
/system
/tests
/writable
打開 app/Config/Autoload.php 并將 Acme 命名空間加入到 psr4
數組成員中:
$psr4 = [
'Config' => APPPATH . 'Config',
APP_NAMESPACE => APPPATH, // 自定義命名空間
'App' => APPPATH, // 確保篩選器等組件可找到,
'Acme' => ROOTPATH.'acme'
];
當我們設置完以上流程后,就可以通過 Acme
命名空間來訪問 acme 目錄下的文件夾內容。這已經完成了80%的模塊工作所需要的內容,
所以你可以通過熟悉命名空間來適應這種使用方式。這樣多種文件類型將會被自動掃描并在整個定義的命名空間中使用——這也是使用模塊的關鍵。
在模塊中的常見目錄結構和主程序目錄類似:
/acme
/Blog
/Config
/Controllers
/Database
/Migrations
/Seeds
/Helpers
/Language
/en
/Libraries
/Models
/Views
當然了,不強制使用這樣的目錄結構,你也可以自定義目錄結構來更好地符合你的模塊要求,去掉那些你不需要的目錄并增加一些新的目錄,例如實體(Entites),接口(Interfaces),倉庫(Repository)等。
自動發現?
很多情況下,你需要指名你所需要包含進來的文件的命名空間全稱,但是CodeIgniter可以通過配置自動發現的文件類型,來將模塊更方便地整合進你的項目中:
這些是在 app/Config/Modules.php 文件中配置的。
自動發現系統通過掃描所有在 Config/Autoload.php 中定義的PSR4類型的命名空間來實現對于目錄/文件的識別。
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.
自動發現與Composer?
通過Composer安裝的包將會默認被自動發現。這只需要Composer識別所需要加載的命名空間是符合PSR4規范的命名空間,PSR0類型的命名空間將不會被發現。
如果在定位文件時,你不想掃描所有Composer已識別的的目錄,可以通過編輯 Config\Modules.php
中的 $discoverInComposer
變量來關閉這一功能:
public $discoverInComposer = false;
處理文件?
這節將會詳細介紹每種文件類型(控制器,視圖,語言文件等)以及在模塊中如果使用它們。其中的某些信息在用戶手冊中將會更為詳細地描述,不過在這里重新介紹一下以便了解全局的情況。
路由?
默認情況下, 路由 將會在模塊內部自動掃描,而這一特性可在 Modules 配置文件中被關閉,如上所述。
注解
由于在當前域內包含了路由文件, $routes
實例已經被定義了,所以當你嘗試重新定義類的時候可能會引起錯誤。
控制器?
在主 app/Controller 目錄下定義的控制器不會自動被URI路由自動調用,所以需要在路由文件內部手動聲明:
// 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.