选择 Yii 2 框架的 7 个理由 已翻译 100%

oschina 投递于 2014/10/16 07:58 (共 12 段, 翻译完成于 10-31)
阅读 19313
收藏 88
1
加载中

去年,SitePoint网站发布了一篇文章重点介绍了一些顶尖的PHP开发框架。 排名第四的是Yii(发音同Yee)框架。 那时Yii框架最新的版本是1.1.14。最近,Yii 2.0版发布了,你可以在产品中使用2.0版本。

当 Yii框架仍处于 RC(候选版)阶段时,我们 对它进行过报道,那时它刚刚全面达到候选版本阶段,(现在它已经发布了正式版本)我们感觉是时候再次讨论这个话题:选择 Yii框架的原因。

daxiang
翻译于 2014/10/16 08:28
1

1. 易于安装

对于web开发人员来说,时间就是金钱,没有人愿意把宝贵的时间花在一个复杂的安装和配置过程。

安装处理使用Composer。如果你想要描述安装的过程,Sitepoint最近发表了一篇很棒的文章,在这儿。我倾向于使用基本的应用程序模板,即使我的网站有一个单独的前端和后端组件。相反,我选择使用一个模块给我的网站的后台部分。(Yii模块是最好的描述,小应用驻留在主应用程序里面)。

注意:许多目录的引用在后面的示例中,从简单的模板去使用目录的结构。

warrior_by
翻译于 2014/10/16 10:22
1

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。

warrior_by
翻译于 2014/10/16 10:44
1

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'
        ]   
    ]
];
LeoXu
翻译于 2014/10/17 13:47
1

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',
        ],
    ],
];

使用上面的配置,需要注意下面一些事项:

  1. 在功能验收测试期间,所有发送的邮件都会被写入一个文件中保存,而非真正地发送出去。

  2. 测试时URL的格式是index.php/controller/action,而非/controller/action。

  3. 测试时需要使用测试数据库,而非生产数据库。

Codeception 内部存在一个特殊的模块,专门用于Yii 框架测试。 它在TestGuy类里添加了一些方法,保证功能测试时 Active RecordYii ORM)可以正常工作。 例如,如果你想查看注册表单是否成功地创建了一个用户名为testuserUser对象,你可以这样做:

$I->amOnPage('register');
$I->fillField('username', 'testuser');
$I->fillField('password', 'qwerty');
$I->click('Register');
$I->seeRecord('app\models\User', array('name' => 'testuser'));

daxiang
翻译于 2014/10/17 08:27
4

5. 简化的安全方案

安全性是任何web应用的重要组成部分,幸运的是Yii有许多很棒的特性能帮你减轻负担.

Yii 带来了一个 安全性 应用程序组件,它暴露了一些可以帮助可以用来创建一个更加安全的应用程序的方法. 其中一些相对而言更加有用的方法有:

  • generatePasswordHash: 从一个密码和一个随机的盐值生成一个安全的哈希值. 这个方法会为你创建一个随机的盐值,然后使用PHP的 crypt 函数来根据所提供的字符串创建一个哈希值.

  • validatePassword: 这是一个可以同 generatePasswordHash 搭配使用的方法, 并可以让你检查用户提供的密码是否同你存储的哈希值匹配.

  • generateRandomKey: 可逆让你创建一个任何长度的随机字符串

Yii 会自动对所有非安全 HTTP 请求方法 (PUT, POST, DELETE) 的可用CSRF令牌进行检查, 并将在你使用 ActiveForm::begin() 方法创建你的开发表单标签时生成并输出一个令牌值. 这个特性可以通过编辑你的主配置文件,包含下面的代码来禁用:

    return [
        'components' => [
            'request' => [
                'enableCsrfValidation' => false,
            ]
    ];
LeoXu
翻译于 2014/10/17 10:52
2

为了堤防跨站脚本XSS的攻击,Yii提供了另外一个叫做 HtmlPurifier 的辅助类. 这个类有一个名为 process 的静态方法, 而它将会使用同名的 流行过滤器库 来过滤你的输出.

Yii 也包含了随时就绪的用于用户认证和授权的类. 授权被分成了两个类型: ACF (访问控制过滤器) 和RBAC (基于角色访问的控制).

两者中更加的是 ACF, 其实现是通过在你控制器的添加下列的 行为 方法:

use yii\filters\AccessControl;

class DefaultController extends Controller {
    // ...
    public function behaviors() {
        return [
            // ...
            'class' => AccessControl::className(),
            'only' => ['create', 'login', 'view'],
                'rules' => [
                [
                    'allow' => true,
                    'actions' => ['login', 'view'],
                    'roles' => ['?']
                ],
                [
                    'allow' => true,
                    'actions' => ['create'],
                    'roles' => ['@']
                ]
            ]
        ];
    }
    // ...
}
LeoXu
翻译于 2014/10/17 10:58
2

上面的代码会告诉 DefaultControllerto 让访客用户访问login和view的action, 而不是create这个action. (问号 ? 是匿名用户的别名, 而 @ 表示的是已经被授权的用户).

RBAC 是一个可以在应用程序中指定那些用户可以执行特定的动作的强大方法. 它涉及为你的用户创建角色,为你的app定义权限,并然后为他们预期的角色使用这些角色. 如果你想要创建一个审核员(Moderator)的角色就可以使用这个方法, 并可以让所有分配到这个角色的用户可以对文章进行审核.

你也还可以使用 RBAC 定义规则, 它可以让你在特定条件下针对你应用程序的某些方面进行授权. 例如,你可以创建一个规则让用户可以编辑他们自己的文章, 而不能修改由其他人创建的文章.

LeoXu
翻译于 2014/10/17 11:31
1

6. 缩短开发时间

大多数的项目都包含了重复的任务,没有人想把时间浪费在这些重复工作上面。Yii 提供了一些工具来帮助你在这些任务上花费更少的时间,把大多数时间都用在定制应用来满足你客户的需求上。

其中最强大的一个工具就是“Gii”。Gii是一个基于web脚手架代码工具,它可以让你快速的创建一个代码模板如下所示:

  • Models

  • Controllers

  • Forms

  • Modules

  • Extensions

  • CRUD controller actions and views

Gii是高度可配置的。你可以设置它只从一个特定的环境加载。简单的编辑web配置文件如下:

if (YII_ENV_DEV) {
    // ...
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
        'allowedIPs' => ['127.0.0.1', '::1']
    ]
}

这确保了Gii只有设置了Yii的环境变量为(development)开发环境时才加载,并且只在通过本地环境访问的时候加载。

牛奋Debug
翻译于 2014/10/16 14:31
1

现在,让我们来看看模型的生成:

Gii Model Generator

表格名称使用了一个响应敲击就会显示的小窗口来尝试给出对你的模型将会关联的表格的猜测, 并且所有的域值输入框都会有一个翻转效果显示出来的提示,提醒你如何完成对它们的填写. 你可以在让Gii输出代码之前先进行一下预览, 而所有的代码模板都是完全可定制的.

也有几个可以用于数据库迁移、消息翻译(I18N)以及生成用于自动化测试数据库道具的命令行辅助工具. 例如,你可以使用如下代码创建一个新的数据库迁移 文件:

yii migrate/create create_user_table

这将会在 {应用目录}/migrations 创建一个新的看起来像下面这样的迁移模板:

<?php

    use yii\db\Schema;

    class m140924_153425_create_user_table extends \yii\db\Migration
    {
        public function up()
        {

        }

        public function down()
        {
            echo "m140924_153425_create_user_table cannot be reverted.\n";

            return false;
        }
}

如此假如说我想要想这个表添加一些列. 我就只要简单的将下面的代码添加到 up 方法中:

public function up()
{
    $this->createTable('user', [
        'id' => Schema::TYPE_PK,
        'username' => Schema::TYPE_STRING . ' NOT NULL',
        'password_hash' => Schema:: TYPE_STRING . ' NOT NULL'
    ], null);
}

然后为了确保我可以进行迁移的逆向操作,我就会编辑down方法:

public function down()
{
    $this->dropTable('user');
}

创建表格可能就是简单的设计到在命令行上运行一个命令:

./yii migrate

而删除表格是下面的这个命令:

./yii migrate/down
LeoXu
翻译于 2014/10/17 14:13
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(66)

逗比刘2
逗比刘2

引用来自“那时青丝”的评论

yii越走越偏了, 推荐tp, 易学适合团队开发。
tpyituo
FecShop
FecShop
Yii2 开源电商项目FecShop
演示地址:http://fecshop.appfront.fancyecommerce.com/cn/
github地址:https://github.com/fancyecommerce/yii2_fecshop
FecShop
FecShop
Fecshop ,Yii2 开源商城,github地址:https://github.com/fancyecommerce/yii2_fecshop

演示地址:http://fecshop.appfront.fancyecommerce.com/
l
leeturn_77
傻B一个, tp确实易用,但从整体架构上来说就是个拉圾。没读过框架源代码的都没资格说话。
Yii的对依赖注入的应用,事件及行为等机制等保证高度扩展,易用性,解偶的代价非常低。
我对Yii2的任一底层比如db类,cache类进行修改,都可以保证单一原则,开闭原则,其他框架能做到么 ?
yiqing95
yiqing95

引用来自“吾爱”的评论

比phalcon如何

引用来自“yiqing95”的评论

yii是专业版的phalcon phalcon 是缩微版的yii 两种框架实际很相似(zf sf,lavarel 这三个风格好像是一家的 偏向java-ee风格 但yii是偏向ror,.net风格的框架(yii中ror风格占比重很大,此外强哥早期维护的是prado【PRADO PHP Framework】是.net风格 事件驱动明显,现在这个框架交由一批.net功底的程序员维护了)) 但phalcon的缺点(也是优点)是c语言 你不能直接学习底层实现思路(毕竟同时用C 又用php的人很少 但不排除都会)
今天刚看一篇博客讲述其项目为何采用yii2的: http://pixeljets.com/blog/building-scalable-it-system-delivery-us-russia-drupal-symfony2-and-yii2-compared
yiqing95
yiqing95

引用来自“吾爱”的评论

比phalcon如何
yii是专业版的phalcon phalcon 是缩微版的yii 两种框架实际很相似(zf sf,lavarel 这三个风格好像是一家的 偏向java-ee风格 但yii是偏向ror,.net风格的框架(yii中ror风格占比重很大,此外强哥早期维护的是prado【PRADO PHP Framework】是.net风格 事件驱动明显,现在这个框架交由一批.net功底的程序员维护了)) 但phalcon的缺点(也是优点)是c语言 你不能直接学习底层实现思路(毕竟同时用C 又用php的人很少 但不排除都会)
灵魂架构师
灵魂架构师

引用来自“止水之约”的评论

不错,比1.x更加容易理解,代码更清晰
一个应用程序创建类继承了5层,好理解?
灵魂架构师
灵魂架构师

引用来自“采女孩的小蘑菇”的评论

你说的laravel都有,切更好用吧
站同
fangood
fangood

引用来自“fatrbaby”的评论

推荐ci、larvel、symfony我很理解,居然还有人推荐thinkPHP,这是要担下反人类的大罪么?
crossmix
crossmix
代码写的好
返回顶部
顶部