使用外部代码
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),而不是一个数值。按如下步骤做:
- 通过Composer安装https://github.com/ramsey/uuid控件:
- 创建一个演示控制台控制器:
<?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);
}
}
- 然后运行:
./yii uuid/generate
- 如果成功,你将会看到如下输出:
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
- 完成了!现在你可以在你的项目中使用Ramsey\Uuid\Uuid类了。
手动安装库
如果库是通过Composer包提供的,我们可以自动安装它。在其它情况下,我们需要进行手工安装。
例如,创建一些库例子:
- 使用如下代码创建awesome/namespaced/Library.php文件:
<?php
namespace awesome\namespaced;
class Library
{
public function method()
{
return 'I am an awesome library with namespace.';
}
}
- 创建old/OldLibrary.php文件:
<?php
class OldLibrary
{
function method()
{
return 'I am an old library without namespace.';
}
}
- 创建函数的集合到文件old/functions.php中:
<?php
function simpleFunction()
{
return 'I am a simple function.';
}
现在在我们的应用中设置这些文件:
- 在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');
- 在文件config/web.php文件顶部定义一个简单的类文件路径:
Yii::$classMap['OldLibrary'] = '@old/OldLibrary.php';
- 在composer.json文件中配置function.php文件的自动加载:
"require-dev": {
...
},
"autoload": {
"files": ["old/functions.php"]
},
"config": {
...
},
并应用修改:
composer update
- 现在创建一个控制器示例:
<?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。
参考
- 欲了解更多有关于在Yii2中集成外部代码以及将框架代码集成到自己项目中的信息,可以参考指南http://www.yiiframework.com/doc-2.0/guide-tutorial-yiiintegration.html
- 更多关于alias的信息,参考http://www.yiiframework.com/doc-2.0/guide-concept-aliases.html
composer.json
中autoload
部分的相关信息参考https://getcomposer.org/doc/01-basic-usage.md#autoloading- 你可以在https://packagist.org搜索和浏览任何Composer包。