# 引入第三方代碼
有時,你可能會需要在 Yii 應用中使用第三方的代碼。又或者是你想要在第三方系統中把 Yii 作為類庫引用。在下面這個板塊中,我們向你展示如何實現這些目標。
## 在 Yii 中使用第三方類庫
要想在 Yii 應用中使用第三方類庫,你主要需要確保這些庫中的類文件都可以被正常導入或可以被自動加載。
### 使用 Composer 包
目前很多第三方的類庫都以?[Composer](https://getcomposer.org/)?包的形式發布。你只需要以下兩個簡單的步驟即可安裝他們:
1. 修改你應用的?`composer.json`?文件,并注明需要安裝哪些 Composer 包。
2. 運行?`php composer.phar install`?安裝這些包。
這些Composer 包內的類庫,可以通過 Composer 的自動加載器實現自動加載。不過請確保你應用的?[入口腳本](http://www.yiichina.com/doc/guide/2.0/structure-entry-scripts)包含以下幾行用于加載 Composer 自動加載器的代碼:
~~~
// install Composer autoloader (安裝 Composer 自動加載器)
require(__DIR__ . '/../vendor/autoload.php');
// include Yii class file (加載 Yii 的類文件)
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
~~~
### 使用下載的類庫
若你的類庫并未發布為一個 Composer 包,你可以參考以下安裝說明來安裝它。在大多數情況下,你需要預先下載一個發布文件,并把它解壓縮到?`BasePath/vendor`?目錄,這里的?`BasePath`?代指你應用程序自身的?[base path(主目錄)](http://www.yiichina.com/doc/guide/2.0/structure-applications#basePath)。
若該類庫包含他自己的類自動加載器,你可以把它安裝到你應用的[入口腳本](http://www.yiichina.com/doc/guide/2.0/structure-entry-scripts)里。我們推薦你把它的安裝代碼置于?`Yii.php`?的導入之前,這樣 Yii 的官方自動加載器可以擁有更高的優先級。
若一個類庫并沒有提供自動加載器,但是他的類庫命名方式符合?[PSR-4](http://www.php-fig.org/psr/psr-4/)?標準,你可以使用 Yii 官方的自動加載器來自動加載這些類。你只需給他們的每個根命名空間聲明一下[根路徑別名](http://www.yiichina.com/doc/guide/2.0/concept-aliases#defining-aliases)。比如,假設說你已經在目錄?`vendor/foo/bar`?里安裝了一個類庫,且這些類庫的根命名空間為?`xyz`。你可以把以下代碼放入你的應用配置文件中:
~~~
[
'aliases' => [
'@xyz' => '@vendor/foo/bar',
],
]
~~~
若以上情形都不符合,最可能是這些類庫需要依賴于 PHP 的 include_path 配置,來正確定位并導入類文件。只需參考它的安裝說明簡單地配置一下 PHP 導入路徑即可。
最悲催的情形是,該類庫需要顯式導入每個類文件,你可以使用以下方法按需導入相關類文件:
* 找出該庫內包含哪些類。
* 在應用的[入口腳本](http://www.yiichina.com/doc/guide/2.0/structure-entry-scripts)里的?`Yii::$classMap`?數組中列出這些類,和他們各自對應的文件路徑。
舉例來說,
~~~
Yii::$classMap['Class1'] = 'path/to/Class1.php';
Yii::$classMap['Class2'] = 'path/to/Class2.php';
~~~
## 在第三方系統內使用 Yii
因為 Yii 提供了很多牛逼的功能,有時,你可能會想要使用它們中的一些功能用來支持開發或完善某些第三方的系統,比如:WordPress,Joomla,或是用其他 PHP 框架開發的應用程序。舉兩個例子吧,你可能會想念方便的 yii\helpers\ArrayHelper 類,或在第三方系統中使用?[Active Record](http://www.yiichina.com/doc/guide/2.0/db-active-record)?活動記錄功能。要實現這些目標,你只需兩個步驟:安裝 Yii,啟動 Yii。
若這個第三方系統支持 Composer 管理他的依賴文件,你可以直接運行一下命令來安裝 Yii:
~~~
php composer.phar require yiisoft/yii2-framework:*
php composer.phar install
~~~
不然的話,你可以[下載](http://www.yiiframework.com/download/)?Yii 的發布包,并把它解壓到對應系統的?`BasePath/vendor`?目錄內。
之后,你需要修改該第三方應用的入口腳本,在開頭位置添加 Yii 的引入代碼:
~~~
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
$yiiConfig = require(__DIR__ . '/../config/yii/web.php');
new yii\web\Application($yiiConfig); // 千萬別在這調用 run() 方法。(笑)
~~~
如你所見,這段代碼與典型的 Yii 應用的[入口腳本](http://www.yiichina.com/doc/guide/2.0/structure-entry-scripts)非常相似。唯一的不同之處在于在 Yii 應用創建成功之后,并不會緊接著調用?`run()`方法。因為,`run()`?方法的調用會接管 HTTP 請求的處理流程。(譯注:換言之,這就不是第三方系統而是 Yii 系統了,URL 規則也會跟著換成 Yii 的規則了)
與 Yii 應用中一樣,你可以依據運行該第三方系統的環境,針對性地配置 Yii 應用實例。比如,為了使用[活動記錄](http://www.yiichina.com/doc/guide/2.0/db-active-record)功能,你需要先用該第三方系統的 DB 連接信息,配置 Yii 的?`db`?應用組件。
現在,你就可以使用 Yii 提供的絕大多數功能了。比如,創建 AR 類,并用它們來操作數據庫。
## 配合使用 Yii 2 和 Yii 1
如果你之前使用 Yii 1,大概你也有正在運行的 Yii 1 應用吧。不必用 Yii 2 重寫整個應用,你也可以通過增添對哪些 Yii 2 獨占功能的支持來增強這個系統。下面我們就來詳細描述一下具體的實現過程。
> 注意:Yii 2 需要 PHP 5.4+ 的版本。你需要確保你的服務器以及現有應用都可以支持 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`?這個類,你應該創建一個定制版的 Yii 來把他們組合起來。上面的代碼里包含了的這個定制版的`Yii`?類,可以用以下代碼創建出來:
~~~
$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']);
~~~
大功告成!此時,你可以在你代碼的任意位置,調用?`Yii::$app`?以訪問 Yii 2 的應用實例,而用?`Yii::app()`?則會返回 Yii 1 的應用實例:
~~~
echo get_class(Yii::app()); // 輸出 'CWebApplication'
echo get_class(Yii::$app); // 輸出 'yii\web\Application'
~~~
- 介紹(Introduction)
- 關于 Yii(About Yii)
- 從 Yii 1.1 升級(Upgrading from Version 1.1)
- 入門(Getting Started)
- 安裝 Yii(Installing Yii)
- 運行應用(Running Applications)
- 第一次問候(Saying Hello)
- 使用 Forms(Working with Forms)
- 玩轉 Databases(Working with Databases)
- 用 Gii 生成代碼(Generating Code with Gii)
- 更上一層樓(Looking Ahead)
- 應用結構(Application Structure)
- 結構概述(Overview)
- 入口腳本(Entry Scripts)
- 應用(Applications)
- 應用組件(Application Components)
- 控制器(Controllers)
- 模型(Models)
- 視圖(Views)
- 模塊(Modules)
- 過濾器(Filters)
- 小部件(Widgets)
- 前端資源(Assets)
- 擴展(Extensions)
- 請求處理(Handling Requests)
- 運行概述(Overview)
- 引導(Bootstrapping)
- 路由引導與創建 URL(Routing and URL Creation)
- 請求(Requests)
- 響應(Responses)
- Sessions and Cookies
- 錯誤處理(Handling Errors)
- 日志(Logging)
- 關鍵概念(Key Concepts)
- 組件(Components)
- 屬性(Properties)
- 事件(Events)
- 行為(Behaviors)
- 配置(Configurations)
- 別名(Aliases)
- 類自動加載(Class Autoloading)
- 服務定位器(Service Locator)
- 依賴注入容器(Dependency Injection Container)
- 配合數據庫工作(Working with Databases)
- 數據庫訪問(Data Access Objects): 數據庫連接、基本查詢、事務和模式操作
- 查詢生成器(Query Builder): 使用簡單抽象層查詢數據庫
- 活動記錄(Active Record): 活動記錄對象關系映射(ORM),檢索和操作記錄、定義關聯關系
- 數據庫遷移(Migrations): 在團體開發中對你的數據庫使用版本控制
- Sphinx
- Redis
- MongoDB
- ElasticSearch
- 接收用戶數據(Getting Data from Users)
- 創建表單(Creating Forms)
- 輸入驗證(Validating Input)
- 文件上傳(Uploading Files)
- 收集列表輸入(Collecting Tabular Input)
- 多模型同時輸入(Getting Data for Multiple Models)
- 顯示數據(Displaying Data)
- 格式化輸出數據(Data Formatting)
- 分頁(Pagination)
- 排序(Sorting)
- 數據提供器(Data Providers)
- 數據小部件(Data Widgets)
- 操作客戶端腳本(Working with Client Scripts)
- 主題(Theming)
- 安全(Security)
- 認證(Authentication)
- 授權(Authorization)
- 處理密碼(Working with Passwords)
- 客戶端認證(Auth Clients)
- 安全領域的最佳實踐(Best Practices)
- 緩存(Caching)
- 概述(Overview)
- 數據緩存(Data Caching)
- 片段緩存(Fragment Caching)
- 分頁緩存(Page Caching)
- HTTP 緩存(HTTP Caching)
- RESTful Web 服務
- 快速入門(Quick Start)
- 資源(Resources)
- 控制器(Controllers)
- 路由(Routing)
- 格式化響應(Response Formatting)
- 授權驗證(Authentication)
- 速率限制(Rate Limiting)
- 版本化(Versioning)
- 錯誤處理(Error Handling)
- 開發工具(Development Tools)
- 調試工具欄和調試器(Debug Toolbar and Debugger)
- 使用 Gii 生成代碼(Generating Code using Gii)
- TBD 生成 API 文檔(Generating API Documentation)
- 測試(Testing)
- 概述(Overview)
- 搭建測試環境(Testing environment setup)
- 單元測試(Unit Tests)
- 功能測試(Functional Tests)
- 驗收測試(Acceptance Tests)
- 測試夾具(Fixtures)
- 高級專題(Special Topics)
- 高級應用模版(Advanced Project Template)
- 從頭構建自定義模版(Building Application from Scratch)
- 控制臺命令(Console Commands)
- 核心驗證器(Core Validators)
- 國際化(Internationalization)
- 收發郵件(Mailing)
- 性能優化(Performance Tuning)
- 共享主機環境(Shared Hosting Environment)
- 模板引擎(Template Engines)
- 集成第三方代碼(Working with Third-Party Code)
- 小部件(Widgets)
- Bootstrap 小部件(Bootstrap Widgets)
- jQuery UI 小部件(jQuery UI Widgets)
- 助手類(Helpers)
- 助手一覽(Overview)
- Array 助手(ArrayHelper)
- Html 助手(Html)
- Url 助手(Url)