`
shareHua
  • 浏览: 13804 次
  • 性别: Icon_minigender_1
  • 来自: 群:57917725
社区版块
存档分类
最新评论

从Yii1.1升级到Yii2(翻译自yii2 / docs / guide / upgrade-from-v1.md )

    博客分类:
  • yii2
阅读更多
【【Yii2 交流群 146409855】】
在这个章节,我们列出从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的参数获取。

```php
$component->on($eventName, $handler, $params);
```
这样改变后,现在可以实现全局事件。给application实例的event简单的绑定触发器:

```php
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:

```php
$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不再有`CClientScript`。`View`已经取代它的角色并有重大改进。具体详见"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列表和相应需要认证的属性。例如:


```php
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()`简化从用户输入到模型的数据产生。例如:

```php
$model = new Post;
if ($this->populate($_POST, $model)) {...}
// 同等于:
if (isset($_POST['Post'])) {
    $model->attributes = $_POST['Post'];
}
```


Widgets
-------
在2.0中使用widget很简单,主要使用`Widget`类的`begin()`, `end()` 和 `widget()`方法。例如:
```php
//注意你必须使用"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支持从注释段中自动生成命令帮助信息。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics