当 Yii框架仍处于 RC(候选版)阶段时,我们 对它进行过报道,那时它刚刚全面达到候选版本阶段,(现在它已经发布了正式版本)我们感觉是时候再次讨论这个话题:选择 Yii框架的原因。
1. 易于安装
对于web开发人员来说,时间就是金钱,没有人愿意把宝贵的时间花在一个复杂的安装和配置过程。
安装处理使用Composer。如果你想要描述安装的过程,Sitepoint最近发表了一篇很棒的文章,在这儿。我倾向于使用基本的应用程序模板,即使我的网站有一个单独的前端和后端组件。相反,我选择使用一个模块给我的网站的后台部分。(Yii模块是最好的描述,小应用驻留在主应用程序里面)。
注意:许多目录的引用在后面的示例中,从简单的模板去使用目录的结构。
2. 利用现代技术
Yii是一种纯粹的面向对象框架,并且利用PHP的一些更高级的功能,包括延迟静态绑定,SPL类和接口,和匿名函数。
所有的类名称空间,它允许你利用PSR-4兼容的自动装载器。这意味着包括Yii 的 HTML的帮助类一样的简单:
use yii\helpers\Html;
Yii 也允许你定义别名来帮助简化你的命名空间。 在上面的示例中, use 语句将加载一个类定义,默认放的目录 /vendor/yiisoft/yii2/helpers. 这个别名在BaseYii 类在第79行中定义:
public static $aliases = ['@yii' => __DIR__];
框架本身的安装使用Composer,是其扩展。 甚至出版的过程扩展一样容易创建自己的 composer.json,并在Github托管代码,列出您的扩展在Packagist。
3. 高度可扩展性
Yii 看起来就像一件样式很棒的西装,但也非常容易根据你的需求来进行定制. 实际上框架的每一个组件都是可以扩展的。一个简单的示例就是添加一个唯一的主体ID到你的视图上。 (你如果对自己为什么可能会想要这样做感兴趣的话,可以看看这篇 文章).
首先,我会在我的 app\components 目录相面创建一个名为 View.php 的文件, 并加入如下代码:
namespace app\components; class View extends yii\web\View { public $bodyId; /* Yii allows you to add magic getter methods by prefacing method names with "get" */ public function getBodyIdAttribute() { return ($this->bodyId != '') ? 'id="' . $this->bodyId . '"' : ''; } }
然后,在我的主布局文件 (app\views\layouts\main.php) 中,我会将如下代码添加到我的HTML中body标签的里面:
<body <?=$this->BodyIdAttribute?>>
而最后,我会加下列的代码添加到我的主配置文件中,以便让Yii知道如何去使用我扩展的视图类,而不是它自己默认的那个类:
return [ // ... 'components' => [ // ... 'view' => [ 'class' => 'app\components\View' ] ] ];
4. 鼓励测试
Yii 框架和Codeception框架紧密地集成在一起。 Codeception 是一个优秀的PHP测试框架,它帮助简化创建单元测试、功能验收测试的流程。 条件是你在为所有的应用程序编写自动化的测试用例,对吧?
Codeception 扩展使得在测试时配置应用程序变得简单。 测试应用程序,只需编辑一个已存在的文件/tests/_config.php。例如:
return [ 'components' => [ 'mail' => [ 'useFileTransport' => true, ], 'urlManager' => [ 'showScriptName' => true, ], 'db' => [ 'dsn' => 'mysql:host=localhost;dbname=mysqldb_test', ], ], ];
使用上面的配置,需要注意下面一些事项:
在功能验收测试期间,所有发送的邮件都会被写入一个文件中保存,而非真正地发送出去。
测试时URL的格式是index.php/controller/action,而非/controller/action。
测试时需要使用测试数据库,而非生产数据库。
Codeception 内部存在一个特殊的模块,专门用于Yii 框架测试。 它在TestGuy类里添加了一些方法,保证功能测试时 Active Record(Yii 的ORM)可以正常工作。 例如,如果你想查看注册表单是否成功地创建了一个用户名为testuser的User对象,你可以这样做:
$I->amOnPage('register'); $I->fillField('username', 'testuser'); $I->fillField('password', 'qwerty'); $I->click('Register'); $I->seeRecord('app\models\User', array('name' => 'testuser'));
5. 简化的安全方案
安全性是任何web应用的重要组成部分,幸运的是Yii有许多很棒的特性能帮你减轻负担.