0 关注者

使用第三方代码

有时,您可能需要在 Yii 应用程序中使用一些第三方代码。或者您可能想在一些第三方系统中使用 Yii 作为库。在本节中,我们将展示如何实现这些目标。

在 Yii 中使用第三方库

要在 Yii 应用程序中使用第三方库,您主要需要确保库中的类已正确包含或可以自动加载。

使用 Composer 包

许多第三方库以 Composer 包的形式发布。您可以通过以下两个简单步骤安装此类库

  1. 修改应用程序的 composer.json 文件,并指定要安装的 Composer 包。
  2. 运行 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

由于 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 2 与 Yii 1 一起使用

如果您之前使用过 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 上编辑它 !