从Yii1.1升级到Yii2(翻译自Yii2 / Docs / Guide / Upgrade-From-V1.md )

在这个章节,我们列出从Yii1.1到Yii2.0的主要改动。我们希望这些列表将帮您更容易的从Yii1.1升级,和更快的在您现有的Yii认知上掌握Yii2.0。

域名空间


Yii2.0最明显的改动是使用了域名空间。基本上每个核心类都用域名空间。例如:yii\web\Request。“C”开头不再用于类名称了。域名空间的取名按照目录格式。例如,yii\web\Request指的是在Yii框架目录下的类文件web/Request.php。因Yii的类加载功能,你可以任意使用任何核心类而无需在类文件中包含。

组件和类


Yii2.0把1.1中的CComponent类拆分为2个类: Object and Component。 Object类是轻量级的基本类,允许通过 getters和 setters来定义类的属性。Component类继承自Object,支持event和behavior 特征。

如果你的类不需要event和behavior 特征,你将考虑使用Object 作为基类。这通常用于表示基本数据结构。

对象配置


Object类引入一个统一的方法配置对象。任何Object子类将按照如下方式声明它的构造函数(如果需要),以便能适当的配置:

class MyClass extends \yii\Object

{

public function __construct($param1, $param2, $config = array()) 


{ 


    // ... 在配置生效前初始化 





    parent::__construct($config); 


} 





public function init() 


{ 


    parent::init(); 





    // ... 在配置生效后初始化 


} 

}

上例,最后一个构造函数的参数必须是一个配置数组包含name-value对用于在构造函数最后初始化属性。你可以重载init()方法在配置生效后完成初始化工作。

按以下惯例,你可以使用如下的配置数组创建和配置一个新的对象:

$object = Yii::createObject(array(

'class' => 'MyClass', 


'property1' => 'abc', 


'property2' => 'cde', 

), $param1, $param2);



事件 


------ 


在Yii2.0不再需要通过`on`-method方式定义event。你可以使用任意事件名称,给event绑定一个handler,使用 `on`方法了: 





```php 


$component->on($eventName, $handler); 


// 从handler上解绑,如下: 


// $component->off($eventName, $handler); 


当你绑定handler时,提供一些参数,可以在handler里面通过event的参数获取。



$component->on($eventName, $handler, $params); 


这样改变后,现在可以实现全局事件。给application实例的event简单的绑定触发器:



Yii::$app->on($eventName, $handler); 


.... 


// 这样将触发event,致使$handler被调用。 


Yii::$app->trigger($eventName); 


路径别称


Yii2.0的扩展了路径别称用途,既支持file/directory 路径又支持URLs。别称必须以@字符开头,区别于file/directory路径和URLs。例如,@yii别称指的是Yii实例目录。Yii核心代码基本上都支持路径别称。例如,FileCache::cachePath能采取路径别称和正常目录路径。

路径别称和类命名空间类似。建议每个根命名空间定义路径别称,这样无需而外的配置就可以用Yii的类自动加载器。例如,因为@yii指向Yii实例目录,某个类,例如yii\web\Request能让yii自动加载。如果你使用第三方类库,例如Zend Framework,你应定义路径别称@Zend指向它的实例目录,Yii将自动加载库里的任何类。

视图View


Yii2.0引入View类代表MVC模式中的view部分。它能通过"view"应用组件在全局配置。它能在任何视图文件中通过’$this’获取。相对于1.1的一个重大改变。

**$this在view文件中不再指向controller或者widget对象了。**它指向view对象用来呈送view文件。获取controller或者widget对象,现在你得使用$this->context.

因为你可以通过"view"应用组件获取view对象,所以现在你可以如下在你代码的任何位置呈送view文件,不一定要在controllers或者widets:



$content = Yii::$app->view->renderFile($viewFile, $params); 


// You can also explicitly create a new View instance to do the rendering 


// $view = new View; 


// $view->renderFile($viewFile, $params); 


还有,Yii 2.0不再有CClientScriptView已经取代它的角色并有重大改进。具体详见"assets"章节。

Yii2.0继续使用PHP作为主要模版语言,内建了两个流行的模版引擎支持:Smarty 和 Twig。Prado模版引擎不再支持了。用这些模版引擎,Smarty视图你只需用tpl作为文件扩展名,Twig视图是twig。你还可以配置View::renderers属性使用其他模版引擎。

模型Models


模型现在是用formName()方法返回一个关联的表单名。这主要用于使用HTML表单收集用户输入给model。之前1.1通常是硬编码作为model的类名。

Yii2.0引入了新的方法scenarios()来申明哪个场景哪些属性需要认证。子类将重载scenarios(),当validate()被调用时,返回scenarios列表和相应需要认证的属性。例如:



public function scenarios() 


{ 


    return array( 


        'backend' => array('email', 'role'), 


        'frontend' => array('email', '!name'), 


    ); 


} 


这个方法还可以决定哪些属性是safe哪些不是。特别是,在某个给定场景,如果一个属性在scenarios()的相应属性列表中而名称不是以!作为前缀的,将被认为safe

因为以上的改变,Yii2.0不再有"safe" 和 "unsafe"认证器了。

如果你的model只有一个场景(很普遍),你不需要重载scenarios(),像1.1一样一切都正常工作。

控制Controllers


render()renderPartial()返回呈送结果,而不是直接发送出来。你必须明确的echo,例如echo $this->render(...);

引入一个新的方法populate()简化从用户输入到模型的数据产生。例如:



$model = new Post; 


if ($this->populate($_POST, $model)) {...} 


// 同等于: 


if (isset($_POST['Post'])) { 


    $model->attributes = $_POST['Post']; 


} 


Widgets


在2.0中使用widget很简单,主要使用Widget类的begin(), end()widget()方法。例如:



//注意你必须使用"echo"显示结果 


echo \yii\widgets\Menu::widget(array('items' => $items)); 





//传递数组初始化对象属性 


$form = \yii\widgets\ActiveForm::begin(array( 


'options' => array('class' => 'form-horizontal'), 


'fieldConfig' => array('inputOptions' => array('class' => 'input-xlarge')), 


)); 


... form inputs here ... 


\yii\widgets\ActiveForm::end(); 


之前1.1,你将必须通过CBaseController的beginWidget()`,

endWidget() and widget()方法输入字符串形式的widget类名称。

高级的IDE才支持上面的方法。

样式Themes


2.0中Themes完全不一样了。他们基于路径映射去"translate"源view到样式view。例如,

如果某个样式的路径映射是array('/www/views' => '/www/themes/basic'),那么view文件/www/views/site/index.php的样式版本将为/www/themes/basic/site/index.php

如此,theme可以应用到任何view文件,甚至是离开controller和widget的context。

再没有 CThemeManager了,取代的方法是theme作为一个可配置属性可在"view"应用组件中配置。

控制台应用Console Applications


Console applications现在由contrllers构成,例如Web应用。实际上console controllers和Web contrllers使用同一个controller基类。

每个console controller 类似于1.1中的CConsoleCommand。由一个或多个actions组成。你可以使用yii <route>命令去执行一个console命令,<route>代表某个controller route(例如:sitemap/index)。剩余的匿名参数被传递到相应的controller action方法,命名参数被当作全局选项在globalOptions()中声明。

Yii2.0支持从注释段中自动生成命令帮助信息。

2013-06-13翻译,此篇原文还在完善中,所以翻译过来的内容和最终稿也会有很大不一致。

不错,赞一个。。

支持下 :lol:

这个最好在github上建个项目。