W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
有時,你可能會需要在 Yii 應用中使用第三方的代碼。又或者是你想要在第三方系統(tǒng)中把 Yii 作為類庫引用。在下面這個板塊中,我們向你展示如何實現(xiàn)這些目標。
要想在 Yii 應用中使用第三方類庫,你主要需要確保這些庫中的類文件都可以被正常導入或可以被自動加載。
目前很多第三方的類庫都以?Composer?包的形式發(fā)布。你只需要以下兩個簡單的步驟即可安裝他們:
composer.json
?文件,并注明需要安裝哪些 Composer 包。php composer.phar install
?安裝這些包。這些Composer 包內(nèi)的類庫,可以通過 Composer 的自動加載器實現(xiàn)自動加載。不過請確保你應用的?入口腳本包含以下幾行用于加載 Composer 自動加載器的代碼:
// install Composer autoloader (安裝 Composer 自動加載器)
require(__DIR__ . '/../vendor/autoload.php');
// include Yii class file (加載 Yii 的類文件)
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
若你的類庫并未發(fā)布為一個 Composer 包,你可以參考以下安裝說明來安裝它。在大多數(shù)情況下,你需要預先下載一個發(fā)布文件,并把它解壓縮到?BasePath/vendor
?目錄,這里的?BasePath
?代指你應用程序自身的?base path(主目錄)。
若該類庫包含他自己的類自動加載器,你可以把它安裝到你應用的入口腳本里。我們推薦你把它的安裝代碼置于?Yii.php
?的導入之前,這樣 Yii 的官方自動加載器可以擁有更高的優(yōu)先級。
若一個類庫并沒有提供自動加載器,但是他的類庫命名方式符合?PSR-4?標準,你可以使用 Yii 官方的自動加載器來自動加載這些類。你只需給他們的每個根命名空間聲明一下根路徑別名。比如,假設(shè)說你已經(jīng)在目錄?vendor/foo/bar
?里安裝了一個類庫,且這些類庫的根命名空間為?xyz
。你可以把以下代碼放入你的應用配置文件中:
[
'aliases' => [
'@xyz' => '@vendor/foo/bar',
],
]
若以上情形都不符合,最可能是這些類庫需要依賴于 PHP 的 include_path 配置,來正確定位并導入類文件。只需參考它的安裝說明簡單地配置一下 PHP 導入路徑即可。
最悲催的情形是,該類庫需要顯式導入每個類文件,你可以使用以下方法按需導入相關(guān)類文件:
Yii::$classMap
?數(shù)組中列出這些類,和他們各自對應的文件路徑。舉例來說,
Yii::$classMap['Class1'] = 'path/to/Class1.php';
Yii::$classMap['Class2'] = 'path/to/Class2.php';
因為 Yii 提供了很多牛逼的功能,有時,你可能會想要使用它們中的一些功能用來支持開發(fā)或完善某些第三方的系統(tǒng),比如:WordPress,Joomla,或是用其他 PHP 框架開發(fā)的應用程序。舉兩個例子吧,你可能會想念方便的 yii\helpers\ArrayHelper 類,或在第三方系統(tǒng)中使用?Active Record?活動記錄功能。要實現(xiàn)這些目標,你只需兩個步驟:安裝 Yii,啟動 Yii。
若這個第三方系統(tǒng)支持 Composer 管理他的依賴文件,你可以直接運行一下命令來安裝 Yii:
php composer.phar require yiisoft/yii2-framework:*
php composer.phar install
不然的話,你可以下載?Yii 的發(fā)布包,并把它解壓到對應系統(tǒng)的?BasePath/vendor
?目錄內(nèi)。
之后,你需要修改該第三方應用的入口腳本,在開頭位置添加 Yii 的引入代碼:
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
$yiiConfig = require(__DIR__ . '/../config/yii/web.php');
new yii\web\Application($yiiConfig); // 千萬別在這調(diào)用 run() 方法。(笑)
如你所見,這段代碼與典型的 Yii 應用的入口腳本非常相似。唯一的不同之處在于在 Yii 應用創(chuàng)建成功之后,并不會緊接著調(diào)用?run()
方法。因為,run()
?方法的調(diào)用會接管 HTTP 請求的處理流程。(譯注:換言之,這就不是第三方系統(tǒng)而是 Yii 系統(tǒng)了,URL 規(guī)則也會跟著換成 Yii 的規(guī)則了)
與 Yii 應用中一樣,你可以依據(jù)運行該第三方系統(tǒng)的環(huán)境,針對性地配置 Yii 應用實例。比如,為了使用活動記錄功能,你需要先用該第三方系統(tǒng)的 DB 連接信息,配置 Yii 的?db
?應用組件。
現(xiàn)在,你就可以使用 Yii 提供的絕大多數(shù)功能了。比如,創(chuàng)建 AR 類,并用它們來操作數(shù)據(jù)庫。
如果你之前使用 Yii 1,大概你也有正在運行的 Yii 1 應用吧。不必用 Yii 2 重寫整個應用,你也可以通過增添對哪些 Yii 2 獨占功能的支持來增強這個系統(tǒng)。下面我們就來詳細描述一下具體的實現(xiàn)過程。
注意:Yii 2 需要 PHP 5.4+ 的版本。你需要確保你的服務器以及現(xiàn)有應用都可以支持 PHP 5.4。
首先,參考前文板塊中給出的方法,在已有的應用中安裝 Yii 2。
之后,如下修改 Yii 1 應用的入口腳步:
// 導入下面會詳細說明的定制 Yii 類文件。
require(__DIR__ . '/../components/Yii.php');
// Yii 2 應用的配置文件
$yii2Config = require(__DIR__ . '/../config/yii2/web.php');
new yii\web\Application($yii2Config); // Do NOT call run()
// Yii 1 應用的配置文件
$yii1Config = require(__DIR__ . '/../config/yii1/main.php');
Yii::createWebApplication($yii1Config)->run();
因為,Yii 1 和 Yii 2 都包含有?Yii
?這個類,你應該創(chuàng)建一個定制版的 Yii 來把他們組合起來。上面的代碼里包含了的這個定制版的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
{
// 復制粘貼 YiiBase (1.x) 文件中的代碼于此
}
Yii::$classMap = include($yii2path . '/classes.php');
// 通過 Yii 1 注冊 Yii2 的類自動加載器
Yii::registerAutoloader(['Yii', 'autoload']);
大功告成!此時,你可以在你代碼的任意位置,調(diào)用?Yii::$app
?以訪問 Yii 2 的應用實例,而用?Yii::app()
?則會返回 Yii 1 的應用實例:
echo get_class(Yii::app()); // 輸出 'CWebApplication'
echo get_class(Yii::$app); // 輸出 'yii\web\Application'
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: