有时,您可能需要在 Yii 应用程序中使用一些第三方代码。或者您可能想在一些第三方系统中使用 Yii 作为库。在本节中,我们将展示如何实现这些目标。
要在 Yii 应用程序中使用第三方库,您主要需要确保库中的类已正确包含或可以自动加载。
许多第三方库以 Composer 包的形式发布。您可以通过以下两个简单步骤安装此类库
composer.json
文件,并指定要安装的 Composer 包。composer install
来安装指定的包。可以使用 Composer 自动加载器自动加载安装的 Composer 包中的类。确保应用程序的 入口脚本 包含以下行来安装 Composer 自动加载器
// install Composer autoloader
require __DIR__ . '/../vendor/autoload.php';
// include Yii class file
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
如果库未作为 Composer 包发布,您应该按照其安装说明进行安装。在大多数情况下,您需要手动下载一个发行版文件并将其解压缩到 BasePath/vendor
目录中,其中 BasePath
代表应用程序的 基本路径。
如果库带有自己的类自动加载器,您可以在应用程序的 入口脚本 中安装它。建议在包含 Yii.php
文件之前完成安装,以便 Yii 类自动加载器在自动加载类时优先使用。
如果库不提供类自动加载器,但其类命名遵循 PSR-4,您可以使用 Yii 类自动加载器来自动加载类。您所需要做的就是为其类中使用的每个根命名空间声明一个 根别名。例如,假设您已将库安装在 vendor/foo/bar
目录中,并且库类位于 xyz
根命名空间下。您可以在应用程序配置中包含以下代码
[
'aliases' => [
'@xyz' => '@vendor/foo/bar',
],
]
如果以上两种情况都不适用,则该库很可能依赖于 PHP include path 配置来正确定位和包含类文件。只需按照其关于如何配置 PHP include path 的说明操作即可。
在最坏的情况下,如果库需要显式包含每个类文件,您可以使用以下方法按需包含类
Yii::$classMap
中列出类及其对应的文件路径。例如,Yii::$classMap['Class1'] = 'path/to/Class1.php';
Yii::$classMap['Class2'] = 'path/to/Class2.php';
由于 Yii 提供了许多优秀的功能,有时您可能希望使用其中一些功能来支持开发或增强第三方系统,例如 WordPress、Joomla 或使用其他 PHP 框架开发的应用程序。例如,您可能希望在第三方系统中使用 yii\helpers\ArrayHelper 类或使用 Active Record 功能。要实现此目标,您主要需要采取两个步骤:安装 Yii 和启动 Yii。
如果第三方系统使用 Composer 来管理其依赖项,请运行以下命令将 Yii 添加到项目需求中
composer require yiisoft/yii2
如果您只想使用 Yii 的数据库抽象层或其他与资产无关的功能,则应要求一个特殊的 Composer 包来阻止 Bower 和 NPM 包的安装。有关详细信息,请参见 cebe/assetfree-yii2。
另请参见有关 通过 Composer 安装 Yii 的一般部分,以获取有关 Composer 和安装过程中可能出现的解决问题的更多信息。
否则,您可以 下载 Yii 发布文件并将其解压缩到 BasePath/vendor
目录中。
接下来,您应该修改第三方系统的入口脚本,在开头包含以下代码
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
$yiiConfig = require __DIR__ . '/../config/yii/web.php';
new yii\web\Application($yiiConfig); // Do NOT call run() here
如您所见,上面的代码与 典型 Yii 应用程序的入口脚本 中的代码非常相似。唯一的区别是,在创建应用程序实例后,不会调用 run()
方法。这是因为通过调用 run()
,Yii 将接管请求处理工作流的控制权,在本例中不需要这样做,并且已经由现有应用程序处理。
与 Yii 应用程序一样,您应该根据运行第三方系统的环境配置应用程序实例。例如,要使用 Active Record 功能,您需要使用第三方系统使用的数据库连接设置配置 db
应用程序组件。
现在,您可以使用 Yii 提供的大多数功能。例如,您可以创建 Active Record 类并使用它们与数据库进行交互。
如果您之前使用过 Yii 1,那么您很可能有一个正在运行的 Yii 1 应用程序。与其用 Yii 2 重写整个应用程序,您可能只想使用 Yii 2 中独有的某些功能来增强它。这可以通过以下说明来实现。
注意:Yii 2 需要 PHP 5.4 或更高版本。您应该确保您的服务器和现有应用程序都支持它。
首先,按照 上一小节 中的说明在现有应用程序中安装 Yii 2。
其次,修改应用程序的入口脚本,如下所示:
// include the customized Yii class described below
require __DIR__ . '/../components/Yii.php';
// configuration for Yii 2 application
$yii2Config = require __DIR__ . '/../config/yii2/web.php';
new yii\web\Application($yii2Config); // Do NOT call run(), yii2 app is only used as service locator
// configuration for Yii 1 application
$yii1Config = require __DIR__ . '/../config/yii1/main.php';
Yii::createWebApplication($yii1Config)->run();
因为 Yii 1 和 Yii 2 都有 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
{
// copy-paste the code from YiiBase (1.x) here
}
spl_autoload_unregister(array('YiiBase','autoload'));
spl_autoload_register(array('Yii','autoload'));
Yii::$classMap = include($yii2path . '/classes.php');
// register Yii 2 autoloader via Yii 1
Yii::registerAutoloader(['yii\BaseYii', 'autoload']);
// create the dependency injection container
Yii::$container = new yii\di\Container;
就这样!现在在您的代码的任何部分,您可以使用 Yii::$app
访问 Yii 2 应用程序实例,而 Yii::app()
将为您提供 Yii 1 应用程序实例
echo get_class(Yii::app()); // outputs 'CWebApplication'
echo get_class(Yii::$app); // outputs 'yii\web\Application'
发现错别字或您认为此页面需要改进?
在 github 上编辑它 !
注册 或 登录 以发表评论。