去年,SitePoint网站发布了一篇 文章重点介绍了一些顶尖的PHP开发框架。 排名第四的是Yii(发音同Yee)框架。 那时Yii框架最新的版本是1.1.14。最近,Yii 2.0版发布了,你可以在产品中使用2.0版本。 当 Yii框架仍处于 RC(候选版)阶段时,我们 对它进行过报道,那时它刚刚全面达到候选版本阶段,(现在它已经发布了正式版本)我们感觉是时候再次讨论这个话题:选择 Yii框架的原因。
|
|
1. 易于安装 对于web开发人员来说,时间就是金钱,没有人愿意把宝贵的时间花在一个复杂的安装和配置过程。 安装处理使用 Composer。如果你想要描述安装的过程,Sitepoint最近发表了一篇很棒的文章,在 这儿。我倾向于使用基本的应用程序模板,即使我的网站有一个单独的前端和后端组件。相反,我选择使用一个 模块给我的网站的后台部分。(Yii模块是最好的描述,小应用驻留在主应用程序里面)。 注意:许多目录的引用在后面的示例中,从简单的模板去使用目录的结构。
|
|
2. 利用现代技术所有的类名称空间,它允许你利用PSR-4兼容的自动装载器。这意味着包括Yii 的HTML的帮助类一样的简单: ?
Yii 也允许你定义别名来帮助简化你的命名空间。 在上面的示例中, use语句将加载一个类定义,默认放的目录/vendor/yiisoft/yii2/helpers. 这个别名在BaseYii 类在第79行中定义: 1
| publicstatic$aliases= ['@yii'=> __DIR__];
|
框架本身的安装使用Composer,是其扩展。 甚至出版的过程扩展一样容易创建自己的composer.json,并在Github托管代码,列出您的扩展在Packagist。
|
|
3. 高度可扩展性Yii 看起来就像一件样式很棒的西装,但也非常容易根据你的需求来进行定制. 实际上框架的每一个组件都是可以扩展的。一个简单的示例就是添加一个唯一的主体ID到你的视图上。 (你如果对自己为什么可能会想要这样做感兴趣的话,可以看看这篇 文章). 首先,我会在我的 app\components 目录相面创建一个名为 View.php 的文件, 并加入如下代码: ?
1
2
3
4
5
6
7
8
9
10
11
12
13
| namespaceapp\components;
classView extendsyii\web\View {
public$bodyId;
/* Yii allows you to add magic getter methods by prefacing method names with "get" */
publicfunctiongetBodyIdAttribute() {
return($this->bodyId != '') ? 'id="'. $this->bodyId . '"': '';
}
}
|
然后,在我的主布局文件 (app\views\layouts\main.php) 中,我会将如下代码添加到我的HTML中body标签的里面: ?
1
| <body <?=$this->BodyIdAttribute?>>
|
而最后,我会加下列的代码添加到我的主配置文件中,以便让Yii知道如何去使用我扩展的视图类,而不是它自己默认的那个类: ?
1
2
3
4
5
6
7
8
9
| return[
// ...
'components'=> [
// ...
'view'=> [
'class'=> 'app\components\View'
]
]
];
|
|
|
4. 鼓励测试 Yii 框架和Codeception框架紧密地集成在一起。 Codeception 是一个优秀的PHP测试框架,它帮助简化创建单元测试、功能验收测试的流程。 条件是你在为所有的应用程序编写自动化的测试用例,对吧? Codeception 扩展使得在测试时配置应用程序变得简单。 测试应用程序,只需编辑一个已存在的文件/tests/_config.php。例如: ?
1
2
3
4
5
6
7
8
9
10
11
12
13
| return[
'components'=> [
'mail'=> [
'useFileTransport'=> true,
],
'urlManager'=> [
'showScriptName'=> true,
],
'db'=> [
'dsn'=> 'mysql:host=localhost;dbname=mysqldb_test',
],
],
];
|
使用上面的配置,需要注意下面一些事项: Codeception 内部存在一个特殊的模块,专门用于Yii 框架测试。 它在TestGuy类里添加了一些方法,保证功能测试时 Active Record(Yii 的ORM)可以正常工作。 例如,如果你想查看注册表单是否成功地创建了一个用户名为testuser的User对象,你可以这样做: ?
1
2
3
4
5
| $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有许多很棒的特性能帮你减轻负担. Yii 带来了一个 安全性 应用程序组件,它暴露了一些可以帮助可以用来创建一个更加安全的应用程序的方法. 其中一些相对而言更加有用的方法有: validatePassword: 这是一个可以同 generatePasswordHash 搭配使用的方法, 并可以让你检查用户提供的密码是否同你存储的哈希值匹配.
Yii 会自动对所有非安全 HTTP 请求方法 (PUT, POST, DELETE) 的可用CSRF令牌进行检查, 并将在你使用 ActiveForm::begin() 方法创建你的开发表单标签时生成并输出一个令牌值. 这个特性可以通过编辑你的主配置文件,包含下面的代码来禁用: ?
1
2
3
4
5
6
| return[
'components'=> [
'request'=> [
'enableCsrfValidation'=> false,
]
];
|
|
|
Yii 也包含了随时就绪的用于用户认证和授权的类. 授权被分成了两个类型: ACF (访问控制过滤器) 和RBAC (基于角色访问的控制). 两者中更加的是 ACF, 其实现是通过在你控制器的添加下列的 行为 方法: ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| useyii\filters\AccessControl;
classDefaultController extendsController {
// ...
publicfunctionbehaviors() {
return[
// ...
'class'=> AccessControl::className(),
'only'=> ['create', 'login', 'view'],
'rules'=> [
[
'allow'=> true,
'actions'=> ['login', 'view'],
'roles'=> ['?']
],
[
'allow'=> true,
'actions'=> ['create'],
'roles'=> ['@']
]
]
];
}
// ...
}
|
|
|
上面的代码会告诉 DefaultControllerto 让访客用户访问login和view的action, 而不是create这个action. (问号 ? 是匿名用户的别名, 而 @ 表示的是已经被授权的用户). RBAC 是一个可以在应用程序中指定那些用户可以执行特定的动作的强大方法. 它涉及为你的用户创建角色,为你的app定义权限,并然后为他们预期的角色使用这些角色. 如果你想要创建一个审核员(Moderator)的角色就可以使用这个方法, 并可以让所有分配到这个角色的用户可以对文章进行审核. 你也还可以使用 RBAC 定义规则, 它可以让你在特定条件下针对你应用程序的某些方面进行授权. 例如,你可以创建一个规则让用户可以编辑他们自己的文章, 而不能修改由其他人创建的文章.
|
|
6. 缩短开发时间
大多数的项目都包含了重复的任务,没有人想把时间浪费在这些重复工作上面。Yii 提供了一些工具来帮助你在这些任务上花费更少的时间,把大多数时间都用在定制应用来满足你客户的需求上。 其中最强大的一个工具就是“Gii”。Gii是一个基于web脚手架代码工具,它可以让你快速的创建一个代码模板如下所示: Gii是高度可配置的。你可以设置它只从一个特定的环境加载。简单的编辑web配置文件如下: ?
1
2
3
4
5
6
7
| if(YII_ENV_DEV) {
// ...
$config['modules']['gii'] = [
'class'=> 'yii\gii\Module',
'allowedIPs'=> ['127.0.0.1', '::1']
]
}
|
这确保了Gii只有设置了Yii的环境变量为(development)开发环境时才加载,并且只在通过本地环境访问的时候加载。
|
|
|