CodeIgniter4 代碼模塊

2020-08-17 14:52 更新

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)等。

自動發(fā)現(xiàn)

很多情況下,你需要指名你所需要包含進來的文件的命名空間全稱,但是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)閉自動發(fā)現(xiàn)

你可以開啟或關(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)。

自動發(fā)現(xiàn)與Composer

通過Composer安裝的包將會默認被自動發(fā)現(xiàn)。這只需要Composer識別所需要加載的命名空間是符合PSR4規(guī)范的命名空間,PSR0類型的命名空間將不會被發(fā)現(xiàn)。

如果在定位文件時,你不想掃描所有Composer已識別的的目錄,可以通過編輯 Config\Modules.php 中的 $discoverInComposer 變量來關(guān)閉這一功能:

public $discoverInComposer = false;

和文件打交道Working With Files

這節(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

輔助函數(shù)

當使用 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');
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號