擴(kuò)展是專門設(shè)計的在 Yii 應(yīng)用中隨時可拿來使用的, 并可重發(fā)布的軟件包。例如,?yiisoft/yii2-debug?擴(kuò)展在你的應(yīng)用的每個頁面底部添加一個方便用于調(diào)試的工具欄, 幫助你簡單地抓取頁面生成的情況。 你可以使用擴(kuò)展來加速你的開發(fā)過程。
信息:本文中我們使用的術(shù)語 "擴(kuò)展" 特指 Yii 軟件包。而用術(shù)語 "軟件包" 和 "庫" 指代非 Yii 專用的通常意義上的軟件包。
要使用擴(kuò)展,你要先安裝它。大多數(shù)擴(kuò)展以?Composer?軟件包的形式發(fā)布, 這樣的擴(kuò)展可采取下述兩個步驟來安裝:
composer.json
?文件,指明你要安裝的是哪個擴(kuò)展 (Composer 軟件包)。composer install
?來安裝指定的擴(kuò)展。注意如果你還沒有安裝?Composer?,你需要先安裝。
默認(rèn)情況,Composer安裝的是在?Packagist?中 注冊的軟件包 - 最大的開源 Composer 代碼庫。你可以在 Packageist 中查找擴(kuò)展。 你也可以?創(chuàng)建你自己的代碼庫?然后配置 Composer 來使用它。 如果是在開發(fā)私有的擴(kuò)展,并且想只在你的其他工程中共享時,這樣做是很有用的。
通過 Composer 安裝的擴(kuò)展會存放在?BasePath/vendor
?目錄下,這里的?BasePath
?指你的應(yīng)用的?base path。因為 Composer 還是一個依賴管理器,當(dāng)它安裝一個包時, 也將安裝這個包所依賴的所有軟件包。
例如想安裝?yiisoft/yii2-imagine
?擴(kuò)展,可按如下示例修改你的?composer.json
?文件:
{
// ...
"require": {
// ... other dependencies
"yiisoft/yii2-imagine": "*"
}
}
安裝完成后,你應(yīng)該能在?BasePath/vendor
?目錄下見到?yiisoft/yii2-imagine
?目錄。你也應(yīng)該 見到另一個?imagine/imagine
目錄,在其中安裝了所依賴的包。
信息:?
yiisoft/yii2-imagine
?是 Yii 由開發(fā)團(tuán)隊維護(hù)一個核心擴(kuò)展, 所有核心擴(kuò)展均由?Packagist?集中管理,命名為yiisoft/yii2-xyz
,其中的?xyz
, 不同擴(kuò)展有不同名稱。
現(xiàn)在你可以使用安裝好的擴(kuò)展了,好比是應(yīng)用的一部分。如下示例展示了如何使用?yiisoft/yii2-imagine
?擴(kuò)展 提供的yii\imagine\Image
?類:
use Yii;
use yii\imagine\Image;
// 生成一個縮略圖
Image::thumbnail('@webroot/img/test-image.jpg', 120, 120)
->save(Yii::getAlias('@runtime/thumb-test-image.jpg'), ['quality' => 50]);
信息: 擴(kuò)展類由?Yii class autoloader?自動加載。
在極少情況下,你可能需要手動安裝一部分或者全部擴(kuò)展,而不是依賴 Composer。 想做到這一點,你應(yīng)當(dāng):
vendor
?目錄。如果擴(kuò)展沒有提供類的自動加載器,但也遵循了?PSR-4 standard?標(biāo)準(zhǔn),那么你可以使用 Yii 提供的類自動加載器來加載擴(kuò)展類。 你需要做的僅僅是為擴(kuò)展的根目錄聲明一個?root alias。 例如,假設(shè)在?vendor/mycompany/myext
?目錄中安裝了一個擴(kuò)展,并且擴(kuò)展類的命名空間為?myext
?, 那么你可以在應(yīng)用配置文件中包含如下代碼:
[
'aliases' => [
'@myext' => '@vendor/mycompany/myext',
],
]
在你需要將你的杰作分享給其他人的時候,你可能會考慮創(chuàng)建一個擴(kuò)展。 擴(kuò)展可包括任何你喜歡的代碼,例如助手類、掛件、模塊,等等。
建議你按照?Composer package?的條款創(chuàng)建擴(kuò)展,以便其他人更容易安裝和使用。 就像上面的章節(jié)講述的那樣。
以下是將擴(kuò)展創(chuàng)建為一個 Composer 軟件包的需遵循的基本步驟。
composer.json
?的文件。 詳情請參考后面的章節(jié)。composer.json
每個 Composer 軟件包在根目錄都必須有一個?composer.json
?文件。該文件包含軟件包的元數(shù)據(jù)。 你可以在?Composer手冊?中找到完整關(guān)于該文件的規(guī)格。 以下例子展示了?yiisoft/yii2-imagine
?擴(kuò)展的?composer.json
?文件。
{
// package name
"name": "yiisoft/yii2-imagine",
// package type
"type": "yii2-extension",
"description": "The Imagine integration for the Yii framework",
"keywords": ["yii2", "imagine", "image", "helper"],
"license": "BSD-3-Clause",
"support": {
"issues": "https://github.com/yiisoft/yii2/issues?labels=ext%3Aimagine",
"forum": "http://www.yiiframework.com/forum/",
"wiki": "http://www.yiiframework.com/wiki/",
"irc": "irc://irc.freenode.net/yii",
"source": "https://github.com/yiisoft/yii2"
},
"authors": [
{
"name": "Antonio Ramirez",
"email": "amigo.cobos@gmail.com"
}
],
// package dependencies
"require": {
"yiisoft/yii2": "*",
"imagine/imagine": "v0.5.0"
},
// class autoloading specs
"autoload": {
"psr-4": {
"yii\\imagine\\": ""
}
}
}
每個 Composer 軟件包都應(yīng)當(dāng)有一個唯一的包名以便能從其他的軟件包中識別出來。 包名的格式為?vendorName/projectName
?。例如在包名?yiisoft/yii2-imagine
?中,vendor 名和 project 名分別是?yiisoft
?和?yii2-imagine
?。
不要用?yiisoft
?作為你的 vendor 名,由于它被 Yii 的核心代碼預(yù)留使用了。
我們推薦你用?yii2-
?作為你的包名的前綴,表示它是 Yii 2 的擴(kuò)展,例如,myname/yii2-mywidget
。 這更便于用戶辨別是否是 Yii 2 的擴(kuò)展。
將你的擴(kuò)展指明為?yii2-extension
?類型很重要,以便安裝的時候 能被識別出是一個 Yii 擴(kuò)展。
當(dāng)用戶運行?composer install
?安裝一個擴(kuò)展時,?vendor/yiisoft/extensions.php
?文件會被自動更新使之包含新擴(kuò)展的信息。從該文件中, Yii 應(yīng)用程序就能知道安裝了 哪些擴(kuò)展 (這些信息可通過 yii\base\Application::extensions 訪問)。
你的擴(kuò)展依賴于 Yii (理所當(dāng)然)。因此你應(yīng)當(dāng)在?composer.json
?文件中列出它 (yiisoft/yii2
)。如果你的擴(kuò)展還依賴其他的擴(kuò)展或者是第三方庫,你也要一并列出來。 確定你也為每一個依賴的包列出了適當(dāng)?shù)陌姹炯s束條件 (比如?1.*
,?@stable
) 。 當(dāng)你發(fā)布一個穩(wěn)定版本時,你所依賴的包也應(yīng)當(dāng)使用穩(wěn)定版本。
大多數(shù) JavaScript/CSS 包是用?Bower?來管理的,而非 Composer。你可使用?Composer asset 插件?使之可以 通過 Composer 來管理這類包。如果你的擴(kuò)展依賴 Bower 軟件包,你可以如下例所示那樣簡單地 在?composer.json
?文件的依賴中列出它。
{
// package dependencies
"require": {
"bower-asset/jquery": ">=1.11.*"
}
}
上述代碼表明該擴(kuò)展依賴于?jquery
?Bower 包。一般來說,你可以在?composer.json
?中用?bower-asset/PackageName
?指定 Bower 包,用?npm-asset/PackageName
?指定 NPM 包。 當(dāng) Compower 安裝 Bower 和 NPM 軟件包時,包的內(nèi)容默認(rèn)會分別安裝到@vendor/bower/PackageName
?和?@vendor/npm/Packages
?下。這兩個目錄還可以分別用?@bower/PackageName
?和@npm/PackageName
?別名指向。
關(guān)于 asset 管理的詳細(xì)情況,請參照?Assets?章節(jié)。
為使你的類能夠被 Yii 的類自動加載器或者 Composer 的類自動加載器自動加載,你應(yīng)當(dāng)在?composer.json
?中指定?autoload
?條目,如下所示:
{
// ....
"autoload": {
"psr-4": {
"yii\\imagine\\": ""
}
}
}
你可以列出一個或者多個根命名空間和它們的文件目錄。
當(dāng)擴(kuò)展安裝到應(yīng)用中后,Yii 將為每個所列出根命名空間創(chuàng)建一個?別名?指向命名空間對應(yīng)的目錄。 例如,上述的?autoload
?條目聲明將對應(yīng)于別名?@yii/imagine
。
擴(kuò)展意味著會被其他人使用,你在開發(fā)中通常需要額外的付出。 下面我們介紹一些通用的及推薦的做法,以創(chuàng)建高品質(zhì)的擴(kuò)展。
為避免沖突以及使你的擴(kuò)展中的類能被自動加載,你的類應(yīng)當(dāng)使用命名空間, 并使類的命名符合?PSR-4 standard?或者?PSR-0 standard?標(biāo)準(zhǔn)。
你的類的命名空間應(yīng)以?vendorName\extensionName
?起始,其中?extensionName
?和項目名相同,除了它沒有?yii2-
?前綴外。例如,對?yiisoft/yii2-imagine
?擴(kuò)展 來說,我們用?yii\imagine
?作為它的類的命名空間。
不要使用?yii
、yii2
?或者?yiisoft
?作為你的 vendor 名。這些名稱已由 Yii 內(nèi)核代碼預(yù)留使用了。
有時候,你可能想讓你的擴(kuò)展在應(yīng)用的?自舉過程?中執(zhí)行一些代碼。 例如,你的擴(kuò)展可能想響應(yīng)應(yīng)用的?beginRequest
?事件,做一些環(huán)境的設(shè)置工作。 雖然你可以指導(dǎo)擴(kuò)展的使用者顯式地將你的擴(kuò)展中的事件句柄附加(綁定)到?beginRequest
?事件, 但是更好的方法是自動完成。
為實現(xiàn)該目標(biāo),你可以創(chuàng)建一個所謂?bootstrapping class?(自舉類)實現(xiàn) yii\base\BootstrapInterface 接口。 例如,
namespace myname\mywidget;
use yii\base\BootstrapInterface;
use yii\base\Application;
class MyBootstrapClass implements BootstrapInterface
{
public function bootstrap($app)
{
$app->on(Application::EVENT_BEFORE_REQUEST, function () {
// do something here
});
}
}
然后你將這個類在?composer.json
?文件中列出來,如下所示,
{
// ...
"extra": {
"bootstrap": "myname\\mywidget\\MyBootstrapClass"
}
}
當(dāng)這個擴(kuò)展安裝到應(yīng)用后,Yii 將在每一個請求的自舉過程中 自動實例化自舉類并調(diào)用其 yii\base\BootstrapInterface::bootstrap() 方法。
你的擴(kuò)展可能要存取數(shù)據(jù)庫。不要假設(shè)使用你的擴(kuò)展的應(yīng)用總是用?Yii::$db
?作為數(shù)據(jù)庫連接。你應(yīng)當(dāng)在需要訪問數(shù)據(jù)庫的類中申明一個?db
?屬性。 這個屬性允許你的擴(kuò)展的用戶可定制你的擴(kuò)展使用哪個 DB 連接。例如, 你可以參考 yii\caching\DbCache 類看一下它是如何申明和使用?db
?屬性的。
如果你的擴(kuò)展需要創(chuàng)建特定的數(shù)據(jù)庫表,或者修改數(shù)據(jù)庫結(jié)構(gòu),你應(yīng)當(dāng)
如果你的擴(kuò)展是掛件或者模塊類型,它有可能需要使用一些?assets?。 例如,一個模塊可能要顯示一些包含圖片,JavaScript 和 CSS 的頁面。因為擴(kuò)展的文件 都是放在同一個目錄之下,安裝之后 Web 無法讀取,你有兩個選擇使得這些 asset 文件目錄 可以通過 Web 讀?。?/p>
我們推薦你使用第二種方法,以便其他人能更容易使用你的擴(kuò)展。 更詳細(xì)的關(guān)于如何處理 assets ,請參照?Assets?章節(jié)。
你的擴(kuò)展可能會在支持不同語言的應(yīng)用中使用!因此,如果你的擴(kuò)展要顯示內(nèi)容給終端用戶, 你應(yīng)當(dāng)試著實現(xiàn)?國際化和本地化,特別地,
Yii::t()
?包裝起來,以便可以進(jìn)行翻譯。 只給開發(fā)者參考的信息(如內(nèi)部異常信息)不需要做翻譯。更詳細(xì)的信息,請參照?Internationalization?章節(jié)。
你一定想讓你的擴(kuò)展可以無暇地運行而不會給其他人帶來問題和麻煩。為達(dá)到這個目的, 你應(yīng)當(dāng)在公開發(fā)布前做測試。
推薦你創(chuàng)建測試用例,做全面覆蓋的測試你的擴(kuò)展,而不只是依賴于手動測試。 每次發(fā)布新版本前,你只要簡單地運行這些測試用例確保一切完好。 Yii 提供了測試支持,使你更容易寫單元測試、驗收測試和功能測試。 詳情請參照?Testing?章節(jié)。
你應(yīng)該為每一個擴(kuò)展定一個版本號(如?1.0.1
)。我們推薦你命名版本號時參照?semantic versioning?決定用什么樣的版本號。
為使其他人知道你的擴(kuò)展,你應(yīng)該公開發(fā)布。
如果你首次發(fā)布一個擴(kuò)展,你應(yīng)該在 Composer 代碼庫中注冊它,例如?Packagist。之后,你所需要做的僅僅是在 版本管理庫中創(chuàng)建一個 tag (如v1.0.1
),然后通知 Composer 代碼庫。 其他人就能查找到這個新的發(fā)布了,并可通過 Composer 代碼庫安裝和更新該擴(kuò)展。
在發(fā)布你的擴(kuò)展時,除了代碼文件,你還應(yīng)該考慮包含如下內(nèi)容 幫助其他人了解和使用你的擴(kuò)展:
readme.md
。changelog.md
。changelog.md
。信息:你的代碼注釋可以寫成 Markdown 格式。
yiisoft/yii2-apidoc
?擴(kuò)展為你提供了一個從你的 代碼注釋生成漂亮的 API 文檔。信息:雖然不做要求,我們還是建議你的擴(kuò)展遵循某個編碼規(guī)范。 你可以參照?core framework code style。
Yii 提供了下列核心擴(kuò)展,由 Yii 開發(fā)團(tuán)隊開發(fā)和維護(hù)。這些擴(kuò)展全都在?Packagist?中注冊,并像?Using Extensions?章節(jié)描述 的那樣容易安裝。
更多建議: