W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
有時(shí),你可能會(huì)需要在 Yii 應(yīng)用中使用第三方的代碼。又或者是你想要在第三方系統(tǒng)中把 Yii 作為類庫(kù)引用。在下面這個(gè)板塊中,我們向你展示如何實(shí)現(xiàn)這些目標(biāo)。
要想在 Yii 應(yīng)用中使用第三方類庫(kù),你主要需要確保這些庫(kù)中的類文件都可以被正常導(dǎo)入或可以被自動(dòng)加載。
目前很多第三方的類庫(kù)都以?Composer?包的形式發(fā)布。你只需要以下兩個(gè)簡(jiǎn)單的步驟即可安裝他們:
composer.json
?文件,并注明需要安裝哪些 Composer 包。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ù)并未發(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)類文件:
Yii::$classMap
?數(shù)組中列出這些類,和他們各自對(duì)應(yīng)的文件路徑。舉例來說,
Yii::$classMap['Class1'] = 'path/to/Class1.php';
Yii::$classMap['Class2'] = 'path/to/Class2.php';
因?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 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'
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: