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

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

模型(Model):

Yii之中的Models都继承与yii\base\Model,通常是用来存储数据并对这些数据设置一些特定的验证规则(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 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的时候,经常会这样:

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代表的是yii\web\View组件,这使得我们可以在view当中设置一些很有用的Views中的属性比如:网页的title,meta等,甚至是注册js 脚本也是OK的,是不是有一种很直观的感受,跟写原生的html一样,我想要什么title就要什么,That is cool!

控制器(Controllers)

首先直接来看一下代码:

<?phpnamespace 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" 字符串,coolreturn '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

Yii2的MVC新特性相关推荐

  1. 我要学ASP.NET MVC 3.0(一): MVC 3.0 的新特性

    摘要 MVC经过其1.0和2.0版本的发展,现在已经到了3.0的领军时代,随着技术的不断改进,MVC也越来越成熟.使开发也变得简洁人性化艺术化. 园子里有很多大鸟都对MVC了如指掌,面对问题犹同孙悟空 ...

  2. 返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API

    返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API 原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 ...

  3. 解读ASP.NET 5 MVC6系列(17):MVC中的其他新特性

    原文:解读ASP.NET 5 & MVC6系列(17):MVC中的其他新特性 (GlobalImport全局导入功能) 默认新建立的MVC程序中,在Views目录下,新增加了一个_Global ...

  4. Spring 2.5:Spring MVC中的新特性

    转载说明:infoQ就是牛人多,看人家去年就把Spring2.5注视驱动的MVC写出来了,还是这么详细,我真是自叹不如,今天偶尔看到这篇文章非常认真的拜读了2遍,简直是茅厕顿开啊....\(^o^)/ ...

  5. Spring4.1新特性——Spring MVC增强

    2019独角兽企业重金招聘Python工程师标准>>> 1.GroovyWebApplicationContext  在Spring 4.1之前没有提供Web集成的Applicati ...

  6. ASP.NET MVC 3.0(一): MVC 3.0 的新特性 摘要

    ASP.NET MVC 3.0(一): MVC 3.0 的新特性 摘要 ASP.NET MVC 3.0(二): MVC的概念及MVC 3.0开发环境 ASP.NET MVC 3.0(三): 初识MVC ...

  7. ASP.NET MVC Preview 2新特性

    装后后看了看dll,还没有用,貌似有几个新特性: 1.System.Web.Abstractions.dll提供了http运行环境的各相关类的默认实现,做UnitTest方便很多了,不用从IHttpX ...

  8. Servlet 3.0 新特性概述

    Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若 ...

  9. C# 8.0的三个令人兴奋的新特性

    C# 语言是在2000发布的,至今已正式发布了7个版本,每个版本都包含了许多令人兴奋的新特性和功能更新.同时,C# 每个版本的发布都与同时期的 Visual Studio 以及 .NET 运行时版本高 ...

最新文章

  1. 美国发布《评估和强化制造与国防工业基础及供应链弹性》报告
  2. 【渝粤教育】电大中专会计电算化 (2)作业 题库
  3. mysql server8 jdbc_mysql8.0 jdbc连接注意事项
  4. python 循环播放音乐_python gstreamer实现视频快进/快退/循环播放功能
  5. MySQL · BUG分析 · Rename table 死锁分析
  6. 机器学习框架_机器学习中的概率框架
  7. 2009-2021网络规划设计师论文题汇总
  8. 开普勒行星运动三定律
  9. VBA-批量删除文本框内容(用类实现)
  10. redis主从,哨兵模式配置
  11. 【转】2018秋招面经
  12. ORA-25156: 旧样式的外部联接 (+) 不能与 ANSI 联接一起使用
  13. html锯齿边框,css3制作邮票(锯齿边框)-css3制作邮票(锯齿边框)-HTML5+CSS3-编玩编学- 注重积累的过程 快速锁定问题解决问题 写博客,在积累源码,持续更新技术博客,加分项...
  14. 命令执行原理和利用知识点
  15. CSS学习笔记(九)display: inline-block,CSS 布局- 水平和垂直对齐
  16. kali 中 嗅探工具 如何分类
  17. python列表中怎么去掉空值_Python 如何删除列表中的空值
  18. 2019年学习java还有前途吗?
  19. IPhone基于OAtuth的 twitter客户端开发
  20. c语言程序设计提纲,C语言程序设计”期末考试复习提纲

热门文章

  1. 转 carrer 之感
  2. 网页中启动QQ的 XX 命令
  3. Apache Kafka(二)- Kakfa 安装与启动
  4. c#利用反射+特性实现简单的实体映射数据库操作类实现自动增删改查(一)
  5. servlet实现文件上传,预览,下载和删除
  6. 用java来实现验证码功能
  7. 工作中Docker使用命令笔记
  8. 货店管理(delphi+sqlserver)
  9. Ihttphander获取session
  10. SPOJ_SUBLEX