View on GitHub

yii2-cookbook-chinese

Yii Application Development Cookbook(Third Edition)中文翻译

使用外部代码

Package repositories,PSR标准,以及社会编码给我们提供了许多高质可复用的库,以及其它有免费条款的控件。我们可以在项目中只安装任何外部控件,instead of reengineering them from scratch。它提高了开发性能并保证了更高质量的代码。

准备

按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。

如何做…

在本章节中,我们将会尝试通过手工和使用Composer添加一些库。

使用Composer安装一个库

当你使用NoSQL或者其它没有自增key的数据库,你必须手工生成唯一识别符。例如,你可以使用通用唯一识别码(Universally Unique Identifier,UUID),而不是一个数值。按如下步骤做:

  1. 通过Composer安装https://github.com/ramsey/uuid控件:
  2. 创建一个演示控制台控制器:
<?php
namespace app\commands;
use Ramsey\Uuid\Uuid;
use yii\console\Controller;
class UuidController extends Controller
{
    public function actionGenerate()
    {
        $this->stdout(Uuid::uuid4()->toString() . PHP_EOL);
        $this->stdout(Uuid::uuid4()->toString() . PHP_EOL);
        $this->stdout(Uuid::uuid4()->toString() . PHP_EOL);
        $this->stdout(Uuid::uuid4()->toString() . PHP_EOL);
        $this->stdout(Uuid::uuid4()->toString() . PHP_EOL);
    }
}
  1. 然后运行:
./yii uuid/generate
  1. 如果成功,你将会看到如下输出:
25841e6c-6060-4a81-8368-4d99aa3617dd
fcac910a-a9dc-4760-8528-491c17591a26
4d745da3-0a6c-47df-aee7-993a42ed915c
0f3e6da5-88f1-4385-9334-b47d1801ca0f
21a28940-c749-430d-908e-1893c52f1fe0
  1. 完成了!现在你可以在你的项目中使用Ramsey\Uuid\Uuid类了。

手动安装库

如果库是通过Composer包提供的,我们可以自动安装它。在其它情况下,我们需要进行手工安装。

例如,创建一些库例子:

  1. 使用如下代码创建awesome/namespaced/Library.php文件:
<?php
namespace awesome\namespaced;
class Library
{
    public function method()
    {
        return 'I am an awesome library with namespace.';
    }
}
  1. 创建old/OldLibrary.php文件:
<?php
class OldLibrary
{
    function method()
    {
        return 'I am an old library without namespace.';
    }
}
  1. 创建函数的集合到文件old/functions.php中:
<?php
function simpleFunction()
{
    return 'I am a simple function.';
}

现在在我们的应用中设置这些文件:

  1. 在config/web.php中给awesome库命名空间根定义新的别名(在alias部分):
$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'aliases' => [
        '@awesome' => '@app/awesome',
    ],
    'components' => [
    // …
    ],
    'params' => // …
];

或者通过setAlias方法设置:

Yii::setAlias('@awesome', '@app/awesome');
  1. 在文件config/web.php文件顶部定义一个简单的类文件路径:
Yii::$classMap['OldLibrary'] = '@old/OldLibrary.php';
  1. 在composer.json文件中配置function.php文件的自动加载:
"require-dev": {
    ...
},
"autoload": {
    "files": ["old/functions.php"]
},
"config": {
    ...
},

并应用修改:

composer update

  1. 现在创建一个控制器示例:
<?php
namespace app\controllers;
use yii\base\Controller;
class LibraryController extends Controller

{
    public function actionIndex()
    {
        $awesome = new \awesome\namespaced\Library();
        echo '<pre>' . $awesome->method() . '</pre>';
        $old = new \OldLibrary();
        echo '<pre>' . $old->method() . '</pre>';
        echo '<pre>' . simpleFunction() . '</pre>';
    }
}

打开这个网页:

在其它框架中使用Yii2

如果你希望和其它框架一起使用Yii2框架代码,只需要在composer.json中添加Yii2定义的参数:

{
    ...
    "extra": {
        "asset-installer-paths": {
            "npm-asset-library": "vendor/npm",
            "bower-asset-library": "vendor/bower"
        }
    }
}

安装这个框架:

composer require yiisoft/yii2

现在打开你的应用的入口脚本(在ZendFramework, Laravel, Symfony等),require Yii2的autoloader,并创建Yii应用实例:

require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
$config = require(__DIR__ . '/../config/yii/web.php');
new yii\web\Application($config);

完成了!现在你可以使用Yii::$app实例、模型、小工具等其它Yii2的控件。

工作原理…

在第一个例子中,我们只是在我们的项目中安装了一个新的Composer包并使用,因为它的composer.json文件定义了所有的autoloading库文件所有的方面。

但是在第二个例子中,我们没有Composer包并且registered the files in the autoloading mechanism manually。在Yii2中,我可以使用alias和Yii::$classMap注册PSR-4命名空间的根和单个文件。

但是另外一个选择是我们可以在所有情况下用Composer autoloader。只需要在composer.json文件中定义个外部autoload部分:

"autoload": {
    "psr-0": { "": "old/" },
    "psr-4": {"awesome\\": "awesome/"},
    "files": ["old/functions.php"]
}

应用这个更新:

composer update

现在你可以从你的配置文件中移除alias和$classMap定义,并确保示例页面仍能正常工作:

这个例子完全使用Composer的autoloader,而不是使用框架的autoloader。

参考