集成第三方代碼(Working with Third-Party Code)

2018-02-24 15:40 更新

引入第三方代碼

有時(shí),你可能會(huì)需要在 Yii 應(yīng)用中使用第三方的代碼。又或者是你想要在第三方系統(tǒng)中把 Yii 作為類庫(kù)引用。在下面這個(gè)板塊中,我們向你展示如何實(shí)現(xiàn)這些目標(biāo)。

在 Yii 中使用第三方類庫(kù)

要想在 Yii 應(yīng)用中使用第三方類庫(kù),你主要需要確保這些庫(kù)中的類文件都可以被正常導(dǎo)入或可以被自動(dòng)加載。

使用 Composer 包

目前很多第三方的類庫(kù)都以?Composer?包的形式發(fā)布。你只需要以下兩個(gè)簡(jiǎn)單的步驟即可安裝他們:

  1. 修改你應(yīng)用的?composer.json?文件,并注明需要安裝哪些 Composer 包。
  2. 運(yùn)行?php composer.phar install?安裝這些包。

這些Composer 包內(nèi)的類庫(kù),可以通過 Composer 的自動(dòng)加載器實(shí)現(xiàn)自動(dòng)加載。不過請(qǐng)確保你應(yīng)用的?入口腳本包含以下幾行用于加載 Composer 自動(dòng)加載器的代碼:

// install Composer autoloader (安裝 Composer 自動(dòng)加載器)
require(__DIR__ . '/../vendor/autoload.php');

// include Yii class file (加載 Yii 的類文件)
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

使用下載的類庫(kù)

若你的類庫(kù)并未發(fā)布為一個(gè) Composer 包,你可以參考以下安裝說明來安裝它。在大多數(shù)情況下,你需要預(yù)先下載一個(gè)發(fā)布文件,并把它解壓縮到?BasePath/vendor?目錄,這里的?BasePath?代指你應(yīng)用程序自身的?base path(主目錄)。

若該類庫(kù)包含他自己的類自動(dòng)加載器,你可以把它安裝到你應(yīng)用的入口腳本里。我們推薦你把它的安裝代碼置于?Yii.php?的導(dǎo)入之前,這樣 Yii 的官方自動(dòng)加載器可以擁有更高的優(yōu)先級(jí)。

若一個(gè)類庫(kù)并沒有提供自動(dòng)加載器,但是他的類庫(kù)命名方式符合?PSR-4?標(biāo)準(zhǔn),你可以使用 Yii 官方的自動(dòng)加載器來自動(dòng)加載這些類。你只需給他們的每個(gè)根命名空間聲明一下根路徑別名。比如,假設(shè)說你已經(jīng)在目錄?vendor/foo/bar?里安裝了一個(gè)類庫(kù),且這些類庫(kù)的根命名空間為?xyz。你可以把以下代碼放入你的應(yīng)用配置文件中:

[
    'aliases' => [
        '@xyz' => '@vendor/foo/bar',
    ],
]

若以上情形都不符合,最可能是這些類庫(kù)需要依賴于 PHP 的 include_path 配置,來正確定位并導(dǎo)入類文件。只需參考它的安裝說明簡(jiǎn)單地配置一下 PHP 導(dǎo)入路徑即可。

最悲催的情形是,該類庫(kù)需要顯式導(dǎo)入每個(gè)類文件,你可以使用以下方法按需導(dǎo)入相關(guān)類文件:

  • 找出該庫(kù)內(nèi)包含哪些類。
  • 在應(yīng)用的入口腳本里的?Yii::$classMap?數(shù)組中列出這些類,和他們各自對(duì)應(yīng)的文件路徑。

舉例來說,

Yii::$classMap['Class1'] = 'path/to/Class1.php';
Yii::$classMap['Class2'] = 'path/to/Class2.php';

在第三方系統(tǒng)內(nèi)使用 Yii

因?yàn)?Yii 提供了很多牛逼的功能,有時(shí),你可能會(huì)想要使用它們中的一些功能用來支持開發(fā)或完善某些第三方的系統(tǒng),比如:WordPress,Joomla,或是用其他 PHP 框架開發(fā)的應(yīng)用程序。舉兩個(gè)例子吧,你可能會(huì)想念方便的 yii\helpers\ArrayHelper 類,或在第三方系統(tǒng)中使用?Active Record?活動(dòng)記錄功能。要實(shí)現(xiàn)這些目標(biāo),你只需兩個(gè)步驟:安裝 Yii,啟動(dòng) Yii。

若這個(gè)第三方系統(tǒng)支持 Composer 管理他的依賴文件,你可以直接運(yùn)行一下命令來安裝 Yii:

php composer.phar require yiisoft/yii2-framework:*
php composer.phar install

不然的話,你可以下載?Yii 的發(fā)布包,并把它解壓到對(duì)應(yīng)系統(tǒng)的?BasePath/vendor?目錄內(nèi)。

之后,你需要修改該第三方應(yīng)用的入口腳本,在開頭位置添加 Yii 的引入代碼:

require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

$yiiConfig = require(__DIR__ . '/../config/yii/web.php');
new yii\web\Application($yiiConfig); // 千萬別在這調(diào)用 run() 方法。(笑)

如你所見,這段代碼與典型的 Yii 應(yīng)用的入口腳本非常相似。唯一的不同之處在于在 Yii 應(yīng)用創(chuàng)建成功之后,并不會(huì)緊接著調(diào)用?run()方法。因?yàn)椋?code>run()?方法的調(diào)用會(huì)接管 HTTP 請(qǐng)求的處理流程。(譯注:換言之,這就不是第三方系統(tǒng)而是 Yii 系統(tǒng)了,URL 規(guī)則也會(huì)跟著換成 Yii 的規(guī)則了)

與 Yii 應(yīng)用中一樣,你可以依據(jù)運(yùn)行該第三方系統(tǒng)的環(huán)境,針對(duì)性地配置 Yii 應(yīng)用實(shí)例。比如,為了使用活動(dòng)記錄功能,你需要先用該第三方系統(tǒng)的 DB 連接信息,配置 Yii 的?db?應(yīng)用組件。

現(xiàn)在,你就可以使用 Yii 提供的絕大多數(shù)功能了。比如,創(chuàng)建 AR 類,并用它們來操作數(shù)據(jù)庫(kù)。

配合使用 Yii 2 和 Yii 1

如果你之前使用 Yii 1,大概你也有正在運(yùn)行的 Yii 1 應(yīng)用吧。不必用 Yii 2 重寫整個(gè)應(yīng)用,你也可以通過增添對(duì)哪些 Yii 2 獨(dú)占功能的支持來增強(qiáng)這個(gè)系統(tǒng)。下面我們就來詳細(xì)描述一下具體的實(shí)現(xiàn)過程。

注意:Yii 2 需要 PHP 5.4+ 的版本。你需要確保你的服務(wù)器以及現(xiàn)有應(yīng)用都可以支持 PHP 5.4。

首先,參考前文板塊中給出的方法,在已有的應(yīng)用中安裝 Yii 2。

之后,如下修改 Yii 1 應(yīng)用的入口腳步:

// 導(dǎo)入下面會(huì)詳細(xì)說明的定制 Yii 類文件。
require(__DIR__ . '/../components/Yii.php');

// Yii 2 應(yīng)用的配置文件
$yii2Config = require(__DIR__ . '/../config/yii2/web.php');
new yii\web\Application($yii2Config); // Do NOT call run()

// Yii 1 應(yīng)用的配置文件
$yii1Config = require(__DIR__ . '/../config/yii1/main.php');
Yii::createWebApplication($yii1Config)->run();

因?yàn)?,Yii 1 和 Yii 2 都包含有?Yii?這個(gè)類,你應(yīng)該創(chuàng)建一個(gè)定制版的 Yii 來把他們組合起來。上面的代碼里包含了的這個(gè)定制版的Yii?類,可以用以下代碼創(chuàng)建出來:

$yii2path = '/path/to/yii2';
require($yii2path . '/BaseYii.php'); // Yii 2.x

$yii1path = '/path/to/yii1';
require($yii1path . '/YiiBase.php'); // Yii 1.x

class Yii extends \yii\BaseYii
{
    // 復(fù)制粘貼 YiiBase (1.x) 文件中的代碼于此
}

Yii::$classMap = include($yii2path . '/classes.php');

// 通過 Yii 1 注冊(cè) Yii2 的類自動(dòng)加載器
Yii::registerAutoloader(['Yii', 'autoload']);

大功告成!此時(shí),你可以在你代碼的任意位置,調(diào)用?Yii::$app?以訪問 Yii 2 的應(yīng)用實(shí)例,而用?Yii::app()?則會(huì)返回 Yii 1 的應(yīng)用實(shí)例:

echo get_class(Yii::app()); // 輸出 'CWebApplication'
echo get_class(Yii::$app);  // 輸出 'yii\web\Application'
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)