Yii2的MVC新特性

这篇文章主要来看看在Yii2之中的MVC,固然,最核心的思想仍是跟Yii1.1同样的,可是我今天是想来看看在Yii2里的MVC跟Yii1.1有什么不一样,或者应该直接说,Yii2的改进在哪里,以致于使得官方敢向着最好的PHP框架目标进击!php

废话就很少说了,下面来看看分别M-V-C这三个部分:html

模型(Model):

Yii之中的Models都继承与yii\base\Model,一般是用来存储数据并对这些数据设置一些特定的验证规则(rules())。每个Model Class其实不少时候都是跟一些更加核心的类(好比Active Record)配合着使用,而在Yii2中,Active Record的加强也让我很惊喜,后续我打算在写一遍文章来专门介绍Yii2的Active Recordios

在每个Model当中,attributesattributes label其实跟Yii1.1差很少,但让我特别值得拍手称快的是在Yii2中,除了rules()函数以外,还有scenarios()函数来加强Yii2的Model验证,rules()函数具体担当为Model的每个attributes进行过滤验证,而scenarios()则能够根据不一样的场景须要来声明哪个attributes是无需验证的(Which means safe here);咱们来看下面的例子:web

<?php
namespace app\models;

use yii\db\ActiveRecord;

class User extends ActiveRecord {

    public function rules()
    {
        return [
            // 当相应的field是 "safe"的时候,rule就起验证做用
            ['username', 'string', 'length' => [4, 32]],
            ['first_name', 'string', 'max' => 128],
            ['password', 'required','on' => 'signup'],
        ];
    }

    public function scenarios()
    {
        return [

            'signup' => ['username', 'password'],
            'update' => ['username', 'first_name'],
        ];
    }
}

这个例子中的password field只分配给Model中的signup 场景(scenario),因此有关password的验证只在signup这个scenario起做用,我的以为这个是Yii2的Model中一个很牛逼的升级,由于这种机制的产生使得咱们在开发的时候对一些attributes的验证和分配有了更灵活的掌控感,大大提升咱们对表单可用性和场景化应用的设计开发。浏览器

多个attributes的分配也有一些细微的变化,咱们以前在Yii1.1的时候,常常会这样:yii2

if (isset($_POST['userModel']))
{
   $model->attributes = $_POST['userModel'];
}

而在Yii2中,你只须要这样:mvc

$model->load($_POST);

这里的关键就是load()函数会自动检查在$model->formName().定义的$_POST的索引app

视图(Views)

在Yii2的Views中也有一些小小的变化,最明显的变化莫过于render()函数了,如今它会返回一个值,而不是像Yii1.1的那样输出(output)值,好比:框架

public function actionIndex()
{
    $models = Posts::find()->all();
    echo $this->render('index', array('models' => $models));
}

看到了没,render的内容如今能够直接用echo来输出了,先无论这是怎么回事(更多细节我会在下面的Controller部分里讲解)。还有一点就是,Yii2还有官方的扩展(official extensions)来支持一些常见的模板引擎如:smartytwig等。喜欢这些模版引擎的同窗,大家有福气了。yii

在Views还有一个值得注意的地方就是$this变量,在Yii1.1中,$this能够说就是连接Controller和Views的中介;而在Yii2中,$this表明的是yii\web\View组件,这使得咱们能够在view当中设置一些颇有用的Views中的属性好比:网页的title,meta等,甚至是注册js 脚本也是OK的,是否是有一种很直观的感觉,跟写原生的html同样,我想要什么title就要什么,That is cool!

控制器(Controllers)

首先直接来看一下代码:

<?php

namespace app\controllers;

use yii\web\Controller;

class SiteController extends Controller
{
    public function actionIndex()
    {
      // 这会 render来自 "views/site/index.php"的视图,用过Yii1.1的同窗应该都很熟悉
        return $this->render('index');
    }

    public function actionTest()
    {
        // 只在浏览器中打印 "test" 字符串,cool
        return 'test';
    }
}

这里你有没有看到use yii\web\Controller?没错,Yii2中已充分开始使用PHP命名空间,当初在Yii1.1的时候一直据说Yii2会使用更高级的PHP特性来彻底重写,果真啊,点个赞。并且如今的Controller中,每一个输出变为了返回,就像上面的actionTest()同样,你如今能够彻底返回一个字符串了,有没有一丝丝Laravel的影子?不过,你在Yii2的Controller中只需认识这些新特性基本就足矣,由于一些更基本的东西跟Yii1.1是同样的撒,彻底不用怕,(我是说若是你上手过Yii1.1的话)。

写在最后

正如你在这篇文章看到的同样,在Yii2中几乎全部的MVC组件变化都使得Yii2更好用了,我相信这会带给开发者更好的的开发体验,毕竟Yii2中看到了一丝丝优雅的样子!因此,各位还在苦恼应该上手哪一个PHP框架的同窗们,请不要犹豫,Yii2就是一个极好的选择。狂点这里:http://www.yiiframework.com/

[原文来自] http://www.jellybool.com/post/yii2-mvc-components

相关文章
相关标签/搜索