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

相關文章
相關標籤/搜索