1. 程式人生 > >Yii2擴充套件開發與程式碼複用:以資源包為例

Yii2擴充套件開發與程式碼複用:以資源包為例

Yii2是目前最流行的PHP開發框架之一,具有簡潔優雅、脈絡清晰、開放融合、易於擴充套件、開發高效等等特點。

在使用Yii2 Framework開發專案的過程中,必然會遇到很多複用程式碼或公共程式碼的管理問題,例如在backend和frontend都會用到的Css樣式資源、Js指令碼資源、圖片資源、自定義的擴充套件元件等等。為了便於維護這些程式碼的版本,且能同時在backend、frontend以及其他子系統中呼叫,使用Yii2的擴充套件是非常好的選擇。

這裡分別以資源和小部件為例進行說明,本文不詳細介紹擴充套件Composer的編寫和配置,如需了這部分內容,可參考《The Definitive Guide to Yii 2.0》的3.12節,裡面詳細介紹瞭如何配置擴充套件的Composer。

Yii2資源擴充套件

Yii2中的資源是前端需要用到的如:Js、Css、圖片、音訊或視訊檔案。通常來說,資原始檔放在Web可訪問的目錄下,由Web伺服器直接讀取。在Yii2中,可以通過編寫資源管理類,由程式自動管理資原始檔。當需要呼叫資源時,只要在檢視或小部件中註冊資源類,Yii2框架就能把需要用到的資源包含在檢視或小部件中。

乍看起來這和擴充套件似乎並無關係,實則不然,這也是編寫本文的主要目的,前文已經提到過在backend和frontend中共用程式碼的問題,若在前後臺應用中分別管理Js或Css檔案,並通過資源類進行管理當然可行,但如果專案中有更多應用,那麼隨之而來的就是這些Js、Css指令碼的版本維護問題,在團隊開發中這會演變成版本控制的“焦油坑”,而且這也不利於程式碼複用和分發。我們的目標是實現對有高複用性的程式碼進行集中管理和維護,且能對這部分程式碼獨立分發,以便於在新的專案中再次複用。

Yii2擴充套件能很方便地滿足我們的需求,下面詳細介紹開發過程。

首先在專案目錄中找到vender目錄,該目錄在專案建立之後即會存在,其部署位置預設是在專案根目錄中,用於存放Yii2框架和擴充套件元件,開發者可以通過以下程式碼修改此目錄的位置:$application->setVendorPath(path)。

在vender目錄下建立一個子目錄,如:nic,用於存放自定義擴充套件;繼續在nic目錄中建立子目錄,這個目錄名稱建議按照Yii2擴充套件開發命名規則,即以“yii2-”開頭,如:yii2-nic-common。在yii2-nic-common目錄中建立assets目錄用於存放資原始檔,如Js、Css或圖片檔案等。至此,目錄結構建立完成。

建立資源包管理類,該類必須宣告為:yii\web\AssetBundle類的子類,該類有幾項用於指定路徑的屬性,分別說明如下:

$basePath屬性:伺服器上存放資原始檔的位置,必須是Web可見目錄,當設定了$sourcePath屬性,則該屬性將被覆蓋;

$baseUrl屬性:相對根URL的資源訪問路徑;

$sourcePath屬性:如果資原始檔不在Web可見目錄中,則要通過該屬性指定資源包位置,一旦設定了該屬性,將會覆蓋$basePath屬性;

$css屬性:該屬性資料型別為陣列,用於指定本資源包需要包含的所有樣式表文件;

$js屬性:該屬性資料型別為陣列,用於指定本資源包需要包含的所有javascript檔案;

$depends屬性:該屬性資料型別為陣列,用於指定本資源包依賴的所有外部資源包,這些資源包類必須已經通過類自動裝載器載入,注意:要從名稱空間開始標識依賴的資源包;

完整的資源包類程式碼如下:

namespace nic\common;

use yii\web\AssetBundle;

/**
 * @author gunnery
 */
class NicCommonAsset extends AssetBundle
{
    public $sourcePath = __DIR__ . "/assets";

    public $js = [
        'nic.common.js',
    ];

    public $css = [
        'nic.common.css',
        'nic.bootstrap.css',
    ];

    public $depends = [
        'yii\web\JqueryAsset',
        'yii\bootstrap\BootstrapAsset',
        'yii\bootstrap\BootstrapPluginAsset',
        'lo\icofont\IcoFontAsset',
    ];
}

在程式碼中可見,先通過$sourcePath屬性設定資源包的位置,然後分別用$js屬性和$css屬性設定的js檔案和css檔案的名稱,再通過$deoends屬性設定依賴項。

僅有資源包程式碼還不能在應用中呼叫,還需要在擴充套件配置檔案中新增資源包的位置,確定類自動裝載器能將載入資源包類。

進入vender目錄下的yiisoft目錄,可以看到有個名為extensions.php的檔案,開啟檔案可以看到裡面已經配置了很多預設自帶的擴充套件。在返回陣列的最後增加一項元素,配置為如下內容:

// Nic擴充套件
'nic' =>
    array (
        'name' => 'nic',
        'version' => '1.0.0',
        'alias' =>
            array (
                '@nic/common' => $vendorDir . '/nic/yii2-common',
            ),
    ),

配置好擴充套件檔案後,就能在檢視或者小部件中註冊資源包了,註冊方法很簡單,只要呼叫資源包的靜態註冊方法即可:NicCommonAsset::register(your_view); 即可完成註冊,在檢視渲染過程中,會自動將必要的資原始檔載入在檢視上。

關於小部件擴充套件下次再寫,過程與此類似。