Yii2的MVC新特性

JellyBool發表於2015-01-07

這篇文章主要來看看在Yii2之中的MVC,當然,最核心的思想還是跟Yii1.1一樣的,但是我今天是想來看看在Yii2裡的MVC跟Yii1.1有什麼不同,或者應該直接說,Yii2的改進在哪裡,以至於使得官方敢向著最好的PHP框架目標進擊!

廢話就不多說了,下面來看看分別M-V-C這三個部分:

模型(Model):

Yii之中的Models都繼承與yiiaseModel,通常是用來儲存資料並對這些資料設定一些特定的驗證規則(rules())。每一個Model Class其實很多時候都是跟一些更加核心的類(比如Active Record)配合著使用,而在Yii2中,Active Record的增強也讓我很驚喜,後續我打算在寫一遍文章來專門介紹Yii2的Active Record

在每一個Model當中,attributesattributes label其實跟Yii1.1差不多,但讓我特別值得拍手稱快的是在Yii2中,除了rules()函式之外,還有scenarios()函式來增強Yii2的Model驗證,rules()函式具體擔當為Model的每一個attributes進行過濾驗證,而scenarios()則可以根據不同的場景需要來宣告哪一個attributes是無需驗證的(Which means safe here);我們來看下面的例子:

<?php
namespace appmodels;

use yiidbActiveRecord;

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的時候,經常會這樣:

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

而在Yii2中,你只需要這樣:

$model->load($_POST);

這裡的關鍵就是load()函式會自動檢查在$model->formName().定義的$_POST的索引

檢視(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等。喜歡這些模版引擎的同學,你們有福氣了。

在Views還有一個值得注意的地方就是$this變數,在Yii1.1中,$this可以說就是連結Controller和Views的中介;而在Yii2中,$this代表的是yiiwebView元件,這使得我們可以在view當中設定一些很有用的Views中的屬性比如:網頁的title,meta等,甚至是註冊js 指令碼也是OK的,是不是有一種很直觀的感受,跟寫原生的html一樣,我想要什麼title就要什麼,That is cool!

控制器(Controllers)

首先直接來看一下程式碼:

<?php

namespace appcontrollers;

use yiiwebController;

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 yiiwebController?沒錯,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

相關文章