使用外部代码

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

手动安装库

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

例如,创建一些库例子:

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

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

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

或者通过setAlias方法设置:

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

并应用修改:

composer update

  1. 现在创建一个控制器示例:
  1. <?php
  2. namespace app\controllers;
  3. use yii\base\Controller;
  4. class LibraryController extends Controller
  5. {
  6. public function actionIndex()
  7. {
  8. $awesome = new \awesome\namespaced\Library();
  9. echo '<pre>' . $awesome->method() . '</pre>';
  10. $old = new \OldLibrary();
  11. echo '<pre>' . $old->method() . '</pre>';
  12. echo '<pre>' . simpleFunction() . '</pre>';
  13. }
  14. }

打开这个网页:

使用外部代码 - 图1

在其它框架中使用Yii2

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

  1. {
  2. ...
  3. "extra": {
  4. "asset-installer-paths": {
  5. "npm-asset-library": "vendor/npm",
  6. "bower-asset-library": "vendor/bower"
  7. }
  8. }
  9. }

安装这个框架:

composer require yiisoft/yii2

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

  1. require(__DIR__ . '/../vendor/autoload.php');
  2. require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
  3. $config = require(__DIR__ . '/../config/yii/web.php');
  4. 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部分:

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

应用这个更新:

  1. composer update

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

使用外部代码 - 图2

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

参考