Commit 094575f4 by Yang Liu

Merge pull request #5 from AbrahamGreyson/master

proofread intro-yii.md and intro-upgrade-from-v1.md
parents a7c38007 440ea63b
从 Yii 1.1 升级
===============
因为 2.0 框架是完完全全的重写,所以在 1.1 和 2.0 两个版本之间,存在了很多不同之处。因此,从 1.1 版本升级的过程并不像小版本间的跨越那么简单,在本手册中你将会了解两个版本间主要的不同之处。
2.0 版框架是完全重写的,在 1.1 和 2.0 两个版本之间存在相当多差异。因此从 1.1 版升级并不像小版本间的跨越那么简单,在本指南中你将会了解两个版本间主要的不同之处。
如果你原先没有用过 Yii 1.1, 你可以直接跳过本章,直接从"[入门篇](start-installation.md)"开始读起。
如果你之前没有用过 Yii 1.1, 可以直接跳过本章,直接从"[入门篇](start-installation.md)"开始读起。
请注意,Yii 2.0 引入了很多这篇总结文章并没有涉及到的新功能。我们强烈建议你通读整部权威手册,来了解所有新功能新特色。这样你将有机会发现一些以前你可能要自己开发的功能,而现在他们很可能已经被包含在核心代码中了也说不定。
请注意,Yii 2.0 引入了很多本章节并没有涉及到的新功能。强烈建议你通读整部权威指南,来了解所有新功能特性。这样可能会发现一些以前你要自己开发的功能,而它们现在已经被包含在核心代码中了。
安装
------------
Yii 2.0 完全拥抱 [Composer](https://getcomposer.org/) 的使用,它其实是实际上的 PHP
包管理器。核心框架以及扩展的安装,都通过 Composer 来处理。想要了解更多如何安装 Yii 2.0
请参阅本指南的 [安装 Yii](start-installation.md) 章节。如果你想创建新的扩展,或者把你已有的 Yii 1.1 的扩展改写成兼容
Yii 2.0 完全拥抱 [Composer](https://getcomposer.org/),它是事实上的 PHP 包管理工具。核心框架以及扩展的安装都通过 Composer 来处理。想要了解更多如何安装 Yii 2.0
请参阅本指南的 [安装 Yii](start-installation.md) 章节。如果你想创建新扩展,或者把你已有的 Yii 1.1 的扩展改写成兼容
2.0 的版本,你可以参考 [创建扩展](extend-creating-extensions.md) 章节。
PHP 需求
----------------
Yii 2.0 需求 PHP 5.4 或以上版本,该版本相对于 Yii 1.1 所需求的 PHP 5.2
而言是一个巨大的改进。也因此,在语言层面上有很多的值得注意的不同之处。
下面是在 PHP 层级发生的主要变化的一个小汇总:
Yii 2.0 需要 PHP 5.4 或以上版本,该版本相对于 Yii 1.1 所需求的 PHP 5.2 而言有巨大的改进。因此在语言层面上有很多的值得注意的不同之处。下面是 PHP 层的主要变化汇总:
- [命名空间](http://php.net/manual/zh/language.namespaces.php)
- [匿名函数](http://php.net/manual/zh/functions.anonymous.php)
- 数组短语法 `[...元素...]` 用于取代 `array(...元素...)`
- 短格式的 echo 标签 `<?=` 现被用于视图文件,它自 PHP 5.4 起总会被识别并且合法,而不管 short_open_tag 的设置是什么,可以安全地调用
- 视图文件中的短格式 echo 标签 `<?=`,自 PHP 5.4 起总会被识别并且合法,无论 short_open_tag 的设置是什么,可以安全使用。
- [SPL 类和接口](http://php.net/manual/zh/book.spl.php)
- [延迟静态绑定](http://php.net/manual/zh/language.oop5.late-static-bindings.php)
- [日期和时间](http://php.net/manual/zh/book.datetime.php)
- [Traits(术语翻译未定:特征或特质)](http://php.net/manual/zh/language.oop5.traits.php)
- [intl](http://php.net/manual/zh/book.intl.php) Yii 2.0 使用 `intl` PHP 扩展来支持国际化的相关功能
- [Traits](http://php.net/manual/zh/language.oop5.traits.php)
- [intl](http://php.net/manual/zh/book.intl.php) Yii 2.0 使用 PHP 扩展 `intl` 来支持国际化的相关功能。
命名空间
---------
Yii 2.0 里最明显的改动就数命名空间的使用了。几乎每一个核心类都引入了命名空间,比如
`yii\web\Request`。原本用于类名前缀的字母“C”已经不再使用了。当前的命名规范与目录结构相吻合。比如,
`yii\web\Request` 就表明对应的类文件是 Yii 框架文件夹下的 `web/Request.php` 文件。
Yii 2.0 里最明显的改动就数命名空间的使用了。几乎每一个核心类都引入了命名空间,比如 `yii\web\Request`。1.1 版用于类名前的字母 “C” 已经不再使用。当前的命名规范与目录结构相吻合。比如,`yii\web\Request` 就表明对应的类文件是 Yii 框架文件夹下的 `web/Request.php` 文件。
(有了 Yii 的类自动加载器,你不需要明确包含那个具体文件的情况下,也能照常使用全部核心类。)
(有了 Yii 的类自动加载器,你可以直接使用全部核心类而不需要显式包含具体文件。)
组件(Component)与对象(Object)
--------------------
Yii 2.0 把 1.1里的 `CComponent` 类拆分成了两个类: [[yii\base\Object]] 和 [[yii\base\Component]]。[[yii\base\Object|Object]]
Yii 2.0 把 1.1 里的 `CComponent` 类拆分成了两个类:[[yii\base\Object]] 和 [[yii\base\Component]]。[[yii\base\Object|Object]]
类是一个轻量级的基类,你可以通过 getters 和 setters 来定义 [object 的属性](concept-properties.md)[[yii\base\Component|Component]]
类继承自 [[yii\base\Object|Object]],同时还进一步支持 [事件](concept-events.md)[行为](concept-behaviors.md)
类继承自 [[yii\base\Object|Object]],同时进一步支持 [事件](concept-events.md)[行为](concept-behaviors.md)
如果你的类不需要用到事件或行为的功能,你应该考虑使用 [[yii\base\Object|Object]] 类作为基类。这通常是需要代表基本数据结构的类。
如果你的类不需要用到事件或行为的功能,应该考虑使用 [[yii\base\Object|Object]] 类作为基类。这通常是表示基本数据结构的类。
配置对象
对象的配置
--------------------
[[yii\base\Object|Object]] 类引入了一种统一的配置对象的方法。所[[yii\base\Object|Object]]
的子类都应该用以下方法声明它的构造器(如果需要的话),以正确配置它自身:
[[yii\base\Object|Object]] 类引入了一种统一对象配置的方法。所有 [[yii\base\Object|Object]]
的子类都应该用以下方法声明它的构造方法(如果需要的话),以正确配置它自身:
```php
class MyClass extends \yii\base\Object
......@@ -81,7 +75,7 @@ class MyClass extends \yii\base\Object
}
```
在上面的例子里,构造器的最后一个参数必须输入一个配置数组,包含一系列用于在构造器的结尾初始化相关属性的键值对。你可以重写
在上面的例子里,构造方法的最后一个参数必须输入一个配置数组,包含一系列用于在方法结尾初始化相关属性的键值对。你可以重写
[[yii\base\Object::init()|init()]] 方法来执行一些需要在配置生效后进行的初始化工作。
你可以通过遵循以下约定俗成的编码习惯,来使用配置数组创建并配置新的对象:
......@@ -94,13 +88,13 @@ $object = Yii::createObject([
], [$param1, $param2]);
```
更多有关配置的细节可以在 [对象配置](concept-configurations.md) 章节找到。
更多有关配置的细节可以在 [配置](concept-configurations.md) 章节找到。
事件(Event)
------
在 Yii 1 里,我们通常通过定义 `on` 开头的方法 (比如 `onBeforeSave`),来创建事件。而在 Yii 2 中,你可以使用任意的事件名了。同时通过调用
在 Yii 1 中,通常通过定义 `on` 开头的方法(例如 `onBeforeSave`)来创建事件。而在 Yii 2 中,你可以使用任意的事件名了。同时通过调用
[[yii\base\Component::trigger()|trigger()]] 方法来触发相关事件:
```php
......@@ -116,21 +110,17 @@ $component->on($eventName, $handler);
// $component->off($eventName, $handler);
```
其实事件功能还有更多改进之处。要了解它们,请查看 [事件(Event)](concept-events.md) 章节。
事件功能还有更多增强之处。要了解它们,请查看[事件(Event)](concept-events.md)章节。
路径别名(Path Alias)
------------
Yii 2.0 扩展类路径别名的应用,文件/目录路径和 URLs 都可以使用路径别名啦。Yii 2.0
中路径别名必须以 `@` 符号开头,以区别于普通文件目录路径或 URL。
比如,`@yii` 就是指向 Yii 安装目录别名。路径别名现在被绝大多数的 Yii 核心代码所支持。比如
[[yii\caching\FileCache::cachePath]] 就同时支持输入一个路径别名或一个普通的目录地址。
Yii 2.0 将路径别名的应用扩大至文件/目录路径和 URL。Yii 2.0 中路径别名必须以 `@` 符号开头,以区别于普通文件目录路径或 URL。
例如 `@yii` 就是指向 Yii 安装目录的别名。绝大多数的 Yii 核心代码都支持别名。例如 [[yii\caching\FileCache::cachePath]] 就同时支持路径别名或普通的目录地址。
路径别名也和类的命名空间密切相关。建议给每一个根命名空间定义一个路径别名,从而无须额外配置,便可启动 Yii
的类自动加载机制。比如,因为有 `@yii` 指向 Yii 安装目录,那类似 `yii\web\Request`
的类就能被 Yii 自动加载。同理,若你用了一个第三方的类库,比如 Zend 框架,你只需定义一个名为 `@Zend`
的路径别名,去指向该框架的安装目录。之后,Yii 就可以自动加载任意 Zend Framework Library 中的类了。
路径别名也和类的命名空间密切相关。建议给每一个根命名空间定义一个路径别名,从而无须额外配置,便可启动 Yii 的类自动加载机制。例如,因为有 `@yii` 指向 Yii 安装目录,那类似 `yii\web\Request`
的类就能被 Yii 自动加载。同理,若你用了一个第三方的类库,如 Zend Framework,你只需定义一个名为 `@Zend` 的路径别名指向该框架的安装目录。之后 Yii 就可以自动加载任意 Zend Framework 中的类了。
更多路径别名信息请参阅[路径别名](concept-aliases.md)章节。
......@@ -138,30 +128,23 @@ Yii 2.0 謇ゥ螻慕アサ霍ッ蠕悪蜷咲噪蠎皮畑梧枚莉カ/逶ョ蠖戊キッ蠕柱 URLs 驛ス蜿ッ莉・菴
视图(View)
-----
Yii 2 的视图最显著的改动是视图内的特殊变量 `$this` 不再指向当前控制器或小部件,而是指向 *视图* 对象。它是一个 2.0
中引入的全新概念。*视图* 对象为 [[yii\web\View]] 的实例,他代表了 MVC 模式中的视图部分。如果你想要在视图中访问一个控制器或者小部件,你可以使用
`$this->context`
Yii 2 中视图最明显的改动是视图内的特殊变量 `$this` 不再指向当前控制器或小部件,而是指向*视图*对象,它是 2.0 中引入的全新概念。*视图*对象为 [[yii\web\View]] 的实例,他代表了 MVC 模式中的视图部分。如果你想要在视图中访问一个控制器或者小部件,你可以使用 `$this->context`
要在其他视图里渲染一个局部视图,你要用 `$this->render()`,而不是 `$this->renderPartial()``render` 的调用也发成了变化,因为
`render()` 现在只返回渲染结果,而不是直接显示它,所以现在你必须显式地把它 **echo** 出来。像这样:
要在其他视图里渲染一个局部视图,使用 `$this->render()`,而不是 `$this->renderPartial()``render()` 现在只返回渲染结果,而不是直接显示它,所以现在你必须显式地把它 **echo** 出来。像这样:
```php
echo $this->render('_item', ['item' => $item]);
```
除了使用 PHP 作为主要的模板语言,Yii 2.0 也装备了两种时髦模板引擎的官方支持:Smarty 和 Twig。过去的 Prado
模板引擎不再被支持。要使用这些模板引擎,你需要配置 `view` 应用组件,给它设置 [[yii\base\View::$renderers|View::$renderers]]
属性。具体请参阅[模板引擎](tutorial-template-engines.md)章节。
除了使用 PHP 作为主要的模板语言,Yii 2.0 也装备了两种流行模板引擎的官方支持:Smarty 和 Twig。过去的 Prado 模板引擎不再被支持。要使用这些模板引擎,你需要配置 `view` 应用组件,给它设置 [[yii\base\View::$renderers|View::$renderers]] 属性。具体请参阅[模板引擎](tutorial-template-engines.md)章节。
模型(Model)
------
Yii 2.0使用 [[yii\base\Model]] 作为模型基类,类似于1.1的 `CModel``CFormModel`
被完全弃用了,现在要创建表单模型类,可以通过继承 [[yii\base\Model]] 类来实现。
Yii 2.0 使用 [[yii\base\Model]] 作为模型基类,类似于 1.1 的 `CModel``CFormModel` 被完全弃用了,现在要创建表单模型类,可以通过继承 [[yii\base\Model]] 类来实现。
Yii 2.0 引进了名为 [[yii\base\Model::scenarios()|scenarios()]]
的新方法来声明支持的场景,并注明在哪个场景下某属性赋值必须验证,可否被视为安全赋值,等等。如:
Yii 2.0 引进了名为 [[yii\base\Model::scenarios()|scenarios()]] 的新方法来声明支持的场景,并指明在哪个场景下某属性必须经过验证,可否被视为安全值等等。如:
```php
public function scenarios()
......@@ -173,22 +156,18 @@ public function scenarios()
}
```
上面的代码声明了两个场景:`backend``frontend` 。对于 `backend` 场景,`email``role`
属性值都是安全的,且能进行批量赋值;对于 `frontend` 场景,`email` 能批量赋值而 `role` 不能。而 `email``role` 都必须通过规则验证。
上面的代码声明了两个场景:`backend``frontend` 。对于 `backend` 场景,`email``role` 属性值都是安全的,且能进行批量赋值。对于 `frontend` 场景,`email` 能批量赋值而 `role` 不能。 `email``role` 都必须通过规则验证。
[[yii\base\Model::rules()|rules()]] 方法仍用于声明验证规则。注意,由于引进了 [[yii\base\Model::scenarios()|scenarios()]]
,现在已经没有 `unsafe` 验证器了。
[[yii\base\Model::rules()|rules()]] 方法仍用于声明验证规则。注意,由于引入了 [[yii\base\Model::scenarios()|scenarios()]],现在已经没有 `unsafe` 验证器了。
大多数情况下,如果 [[yii\base\Model::rules()|rules()]] 方法内已经完整地指定场景了,那就不必覆写 [[yii\base\Model::scenarios()|scenarios()]]
,也不必声明 `unsafe` 属性值。
大多数情况下,如果 [[yii\base\Model::rules()|rules()]] 方法内已经完整地指定场景了,那就不必覆写 [[yii\base\Model::scenarios()|scenarios()]],也不必声明 `unsafe` 属性值。
要了解更多有关模型的细节,请参考[模型](structure-models.md)章节。
控制器(Controller)
-----------
Yii 2.0 使用 [[yii\web\Controller]] 作为控制器的基类,类似于 1.1 的 `CWebController`。使用 [[yii\base\Action]]
作为操作类的基类。
Yii 2.0 使用 [[yii\web\Controller]] 作为控制器的基类,类似于 1.1 的 `CWebController`。使用 [[yii\base\Action]] 作为操作类的基类。
这些变化最明显的影响是,当你在写控制器操作的代码时,你应该返回(return)要渲染的内容而不是输出(echo)它:
......@@ -210,10 +189,9 @@ public function actionView($id)
小部件(Widget)
-------
Yii 2.0 使用 [[yii\base\Widget]] 作为小部件基类,类似于1.1的 `CWidget`
Yii 2.0 使用 [[yii\base\Widget]] 作为小部件基类,类似 于1.1 的 `CWidget`
为了让 IDE 更好地支持框架,Yii 2.0 引进了一个调用小部件的新语法。就是引入了 [[yii\base\Widget::begin()|begin()]], [[yii\base\Widget::end()|end()]]
[[yii\base\Widget::widget()|widget()]] 三个静态方法,用法如下:
为了让框架获得更好的 IDE 支持,Yii 2.0 引进了一个调用小部件的新语法。就是 [[yii\base\Widget::begin()|begin()]],[[yii\base\Widget::end()|end()]] 和 [[yii\base\Widget::widget()|widget()]] 三个静态方法,用法如下:
```php
use yii\widgets\Menu;
......@@ -237,10 +215,7 @@ ActiveForm::end();
主题(Theme)
------
2.0 主题的运作方式跟以往完全不同了。它们现在基于一个
**路径映射机制**,该机制会把一个源视图文件的路径映射到一个主题视图文件路径。举例来说,如果路径映射为
`['/web/views' => '/web/themes/basic']`,那么 `/web/views/site/index.php` 视图的主题修饰版就会是
`/web/themes/basic/site/index.php`。也因此让主题现在可以应用在任何视图文件之上,甚至是渲染于控制器或小部件的上下文环境之外的视图文件。
2.0 主题的运作方式跟以往完全不同了。它们现在基于**路径映射机制**,该机制会把一个源视图文件的路径映射到一个主题视图文件路径。举例来说,如果路径映射为 `['/web/views' => '/web/themes/basic']`,那么 `/web/views/site/index.php` 视图的主题修饰版就会是 `/web/themes/basic/site/index.php`。也因此让主题现在可以应用在任何视图文件之上,甚至是渲染控制器或小部件上下文环境之外的视图文件。
同样,`CThemeManager` 组件已经被移除了。取而代之的是,`theme` 成为了 `view` 应用组件的一个可配置属性。
......@@ -250,8 +225,7 @@ ActiveForm::end();
控制台应用(Console Application)
--------------------
控制台应用现在如普通的 Web 应用程序一样,由控制器组成,控制台的控制器继承自 [[yii\console\Controller]]
,类似于1.1的 `CConsoleCommand`
控制台应用现在如普通的 Web 应用程序一样,由控制器组成,控制台的控制器继承自 [[yii\console\Controller]],类似于 1.1 的 `CConsoleCommand`
运行控制台命令使用 `yii <route>`,其中 `<route>` 代表控制器的路由(如 `sitemap/index`)。额外的匿名参数传递到对应的控制器操作,而有名的参数根据
[[yii\console\Controller::options()]] 的声明来解析。
......@@ -264,7 +238,7 @@ Yii 2.0 謾ッ謖∝渕莠惹サ」遐∵ウィ驥願蜉ィ逕滓逶ク蜈ウ蜻ス莉、逧クョ蜉ゥelp我ソ。諱
国际化(I18N)
----
Yii 2.0 移除了原来内置的日期格式器和数字格式器,为了方便 [PECL intl PHP module](http://pecl.php.net/package/intl) (PHP 的国际化扩展)模块的使用。
Yii 2.0 移除了原来内置的日期格式器和数字格式器,为了支持 [PECL intl PHP module](http://pecl.php.net/package/intl) (PHP 的国际化扩展)模块的使用。
消息翻译现在由 `i18n` 应用组件执行。该组件管理一系列消息源,允许使用基于消息类别的不同消息源。
......@@ -274,9 +248,7 @@ Yii 2.0 遘サ髯、莠次譚・蜀スョ逧律譛滓シ蠑丞勣蜥梧焚蟄玲シ蠑丞勣御クコ莠婿萓ソ
操作过滤器(Action Filters)
--------------
操作的过滤现在通过行为(behavior)来实现。要定义一个新的,自定义的过滤器,请继承 [[yii\base\ActionFilter]]
类。要使用一个过滤器,需要把过滤器类作为一个 `behavior` 绑定到控制器上。比如,要使用 [[yii\filters\AccessControl]]
过滤器,你需要在控制器内添加如下代码:
操作的过滤现在通过行为(behavior)来实现。要定义一个新的,自定义的过滤器,请继承 [[yii\base\ActionFilter]] 类。要使用一个过滤器,需要把过滤器类作为一个 `behavior` 绑定到控制器上。例如,要使用 [[yii\filters\AccessControl]] 过滤器,你需要在控制器内添加如下代码:
```php
public function behaviors()
......@@ -298,11 +270,9 @@ public function behaviors()
前端资源(Assets)
------
Yii 2.0 引入了一个新的概念,称为 *资源包*Asset Bundle),以代替 1.1 的脚本包概念。
Yii 2.0 引入了一个新的概念,称为*资源包*(Asset Bundle),以代替 1.1 的脚本包概念。
一个资源包是一个目录下的资源文件集合(如 JavaScript 文件、CSS 文件、图片文件等)。每一个资源包被表示为一个类,该类继承自
[[yii\web\AssetBundle]]。用 [[yii\web\AssetBundle::register()]] 方法注册一个资源包后,就使它的资源可被 Web
访问,注册了资源包的页面会自动包含和引用资源包内指定的 JS 和 CSS 文件。
一个资源包是一个目录下的资源文件集合(如 JavaScript 文件、CSS 文件、图片文件等)。每一个资源包被表示为一个类,该类继承自 [[yii\web\AssetBundle]]。用 [[yii\web\AssetBundle::register()]] 方法注册一个资源包后,就使它的资源可被 Web 访问了,注册了资源包的页面会自动包含和引用资源包内指定的 JS 和 CSS 文件。
更多细节请参阅 [前端资源管理(Asset)](structure-assets.md) 章节。
......@@ -318,15 +288,12 @@ Yii 2.0 蠕亥、壼クク逕ィ逧撕諤∝勧謇狗アサ悟桁諡ャ
* [[yii\helpers\FileHelper]]
* [[yii\helpers\Json]]
请参考 [手一览](helper-overview.md) 章节来了解更多。
请参考[手一览](helper-overview.md) 章节来了解更多。
表单
-----
Yii 2.0 引进了 *表单栏(field)* 的概念,用来创建一个基于 [[yii\widgets\ActiveForm]]
的表单。一个表单栏是一个由标签、输入框、错误消息(可能还有提示文字)组成的容器,被表示为 [[yii\widgets\ActiveField|ActiveField]] 对象。
使用表单栏建立表单的过程比以前更整洁利落:
Yii 2.0 引进了*表单栏(field)*的概念,用来创建一个基于 [[yii\widgets\ActiveForm]]的表单。一个表单栏是一个由标签、输入框、错误消息(可能还有提示文字)组成的容器,被表示为 [[yii\widgets\ActiveField|ActiveField]] 对象。使用表单栏建立表单的过程比以前更整洁利落:
```php
<?php $form = yii\widgets\ActiveForm::begin(); ?>
......@@ -338,17 +305,14 @@ Yii 2.0 蠑戊ソ帑コ *陦ィ蜊墓擾シield* 逧ヲょソオ檎畑譚・蛻帛サコ荳荳ェ蝓コ莠 [[
<?php yii\widgets\ActiveForm::end(); ?>
```
请参考 [创建表单](input-forms.md) 章节来了解更多细节。
请参考[创建表单](input-forms.md)章节来了解更多细节。
查询生成器(Query Builder)
-------------
Yii 1.1中,查询语句的构建分散在多个类中,包括`CDbCommand``CDbCriteria` 以及
`CDbCommandBuilder`。Yii 2.0 以 [[yii\db\Query|Query]] 对象的形式表示一个数据库查询,这个对象可以在
[[yii\db\QueryBuilder|QueryBuilder]] 的帮助下于幕后生成 SQL 语句。
例如:
Yii 1.1 中,查询语句的生成分散在多个类中,包括 `CDbCommand``CDbCriteria` 以及 `CDbCommandBuilder`。Yii 2.0 以 [[yii\db\Query|Query]] 对象的形式表示一个数据库查询,这个对象可以在
[[yii\db\QueryBuilder|QueryBuilder]] 的帮助下于幕后生成 SQL 语句。例如:
```php
$query = new \yii\db\Query();
......@@ -361,20 +325,17 @@ $sql = $command->sql;
$rows = $command->queryAll();
```
绝的是,这些查询生成方法还TM可以和[活动记录](db-active-record.md)配合使用
重要的是,这些查询生成方法还可以和[活动记录](db-active-record.md)配合使用。
请参考[查询生成器(Query Builder)](db-query-builder.md) 节了解更多内容。
请参考[查询生成器(Query Builder)](db-query-builder.md)章节了解更多内容。
活动记录(Active Record)
-------------
Yii 2.0 的[活动记录](db-active-record.md)改动了很多。两个最显而易见的改动分别涉及查询语句的构建(query
building)和关联查询的处理(relational query handling)。
Yii 2.0 的[活动记录](db-active-record.md)改动了很多。两个最显而易见的改动分别涉及查询语句的生成(query building)和关联查询的处理(relational query handling)。
在 1.1 中的 `CDbCriteria` 类在 Yii 2 中被 [[yii\db\ActiveQuery]] (活动查询)所替代。这个类是继承自
[[yii\db\Query]],因此也继承了所有查询生成方法。当需要开始拼装一个查询了,你可以调用 [[yii\db\ActiveRecord::find()]]
方法来开头:
1.1 中的 `CDbCriteria` 类在 Yii 2 中被 [[yii\db\ActiveQuery]] 所替代。这个类是继承自 [[yii\db\Query]],因此也继承了所有查询生成方法。开始拼装一个查询可以调用 [[yii\db\ActiveRecord::find()]] 方法进行:
```php
// 检索所有 *活动的* 客户和订单,并以 ID 排序:
......@@ -384,9 +345,7 @@ $customers = Customer::find()
->all();
```
要声明一个关联关系,只需简单地定义一个 getter 方法来返回一个 [[yii\db\ActiveQuery|ActiveQuery]]
对象。getter 方法定义的属性名(译者注:即 getOrders() 中的 orders)表示关联关系名。如,以下代码声明了一个名为 `orders`
的关系(1.1 中必须在 `relations()` 方法内声明关系):
要声明一个关联关系,只需简单地定义一个 getter 方法来返回一个 [[yii\db\ActiveQuery|ActiveQuery]] 对象。getter 方法定义的属性名(译者注:即 getOrders() 中的 orders)表示关联关系名。如,以下代码声明了一个名为 `orders` 的关系(1.1 中必须在 `relations()` 方法内声明关系):
```php
class Customer extends \yii\db\ActiveRecord
......@@ -397,24 +356,22 @@ class Customer extends \yii\db\ActiveRecord
}
}
```
现在你就可以通过调用 `$customer->orders`
来从关联表中访问所有用户的订单了。你还可以用以下代码进行一场,使用定制的查询条件执行的“即时演算”关联查询:
现在你就可以通过调用 `$customer->orders` 来访问关联表中某用户的订单了。你还可以用以下代码进行一场定制查询条件的实时关联查询:
```php
$orders = $customer->getOrders()->andWhere('status=1')->all();
```
当贪婪加载一段关联关系时,Yii 2.0 和 1.1 的运作机理并不相同。具体来说,在 1.1 中,为同时选出主表和关联记录,会生成一个 JOIN
查询。在 Yii 2.0 中会使用两个没有 JOIN 的 SQL 语句:第一条语句取回主表记录,第二条取回用主表记录的主键信息筛选后的关联记录。
当贪婪加载一段关联关系时,Yii 2.0 和 1.1 的运作机理并不相同。具体来说,在 1.1 中,使用一条 JOIN 语句同时查询主表和关联表记录。在 Yii 2.0 中会使用两个没有 JOIN 的 SQL 语句:第一条语句取回主表记录,第二条通过主表记录经主键筛选后查询关联表记录。
构建会返回大量记录的查询时,可以添加 [[yii\db\ActiveQuery::asArray()|asArray()]] 方法链的方法,这样会以数组的形式返回查询结果,而不必返回
[[yii\db\ActiveRecord|ActiveRecord]] 对象,这能明显降低因大量记录读取所消耗的 CPU 时间和内存。如:
生成会返回大量记录的查询时,可以链式书写 [[yii\db\ActiveQuery::asArray()|asArray()]] 方法,这样会以数组的形式返回查询结果,而不必返回
[[yii\db\ActiveRecord|ActiveRecord]] 对象,这能显著降低因大量记录读取所消耗的 CPU 时间和内存。如:
```php
$customers = Customer::find()->asArray()->all();
```
另一个改变是你不能再通过公共数据定义特性(Attribute)的默认值了。如果你需要这么做的话,你可以在你的记录类的 `init` 方法中设置它们。
另一个改变是你不能再通过公共数据定属性(Attribute)的默认值了。如果你需要这么做的话,可以在你的记录类的 `init` 方法中设置它们。
```php
public function init()
......@@ -424,10 +381,9 @@ public function init()
}
```
曾几何时,在 1.1 中重写一个活动记录类的构造器(Constructor)会导致一些问题。它们在 2.0
中不会再出现了。需要注意的是,如果你需要在构造器中添加一些参数,你恐怕必须重写 [[yii\db\ActiveRecord::instantiate()]] 方法。
曾几何时,在 1.1 中重写一个活动记录类的构造方法(Constructor)会导致一些问题。它们不会在 2.0 中出现了。需要注意的是,如果你需要在构造方法中添加一些参数,恐怕必须重写 [[yii\db\ActiveRecord::instantiate()]] 方法。
活动记录方面还有很多其他的变化与改进,请参考 [活动记录](db-active-record.md) 章节以了解更多细节。
活动记录方面还有很多其他的变化与改进,请参考[活动记录](db-active-record.md)章节以了解更多细节。
用户及身份验证接口(IdentityInterface)
......@@ -436,15 +392,13 @@ public function init()
1.1 中的 `CWebUser` 类现在被 [[yii\web\User]] 所取代,随之 `CUserIdentity` 类也不在了。与之相对的,为达到相同目的,你可以实现
[[yii\web\IdentityInterface]] 接口,它使用起来更直观。在高级应用模版里提供了一个这么样的一个例子。
要了解更多细节请参考 [认证(Authentication)](security-authentication.md)[授权(Authorization)](security-authorization.md) 以及
[高级应用模版](tutorial-advanced-app.md) 这三个章节。
要了解更多细节请参考[认证(Authentication)](security-authentication.md)[授权(Authorization)](security-authorization.md)以及[高级应用模版](tutorial-advanced-app.md) 这三个章节。
URL 管理
--------
Yii 2.0 的 URL 管理跟 1.1 中很像。一个主要的改进是现在的 URL 管理支持 **可选参数** 了。比如,如果你在 2.0 中定义了一个下面这样的规则,那么它可以同时匹配
`post/popular``post/1/popular` 两种 URL。而在 1.1 中为达成相同效果,必须要使用两条规则。
Yii 2.0 的 URL 管理跟 1.1 中很像。一个主要的改进是现在的 URL 管理支持**可选参数**了。比如,如果你在 2.0 中定义了一个下面这样的规则,那么它可以同时匹配 `post/popular``post/1/popular` 两种 URL。而在 1.1 中为达成相同效果,必须要使用两条规则。
```php
[
......@@ -459,4 +413,4 @@ Yii 2.0 逧 URL 邂。逅キ 1.1 荳ュ蠕亥ワ縲ゆク荳ェ荳サ隕∫噪謾ケ霑帶弍邇ー蝨ィ逧 URL
同时使用 Yii 1.1 和 2.x
----------------------
如果你遗留有一些 Yii 1.1 的代码,需要跟 Yii 2.0 一起使用,你可以参考 [1.1 和 2.0 共用](extend-using-v1-v2.md) 章节。
如果你有一些遗留的 Yii 1.1 代码,需要跟 Yii 2.0 一起使用,可以参考 [1.1 和 2.0 共用](extend-using-v1-v2.md) 章节。
Yii 是什么
===========
Yii 是一个高性能的、基于组件的 PHP 框架,用于快速开发现代 Web 应用程序。名字 Yii (读作 `Yee``[ji:]`) 在汉语中的意
思是“简单、发展变化”。也可以看作是 **Yes It Is**! 的缩写。
Yii 是一个高性能基于组件的 PHP 框架,用于快速开发现代 Web 应用程序。名字 Yii (读作 `Yee``[ji:]`) 在汉语中的意
思是“简单变化”。也可以看作是 **Yes It Is**! 的缩写。
Yii 最适合做什么?
---------------------
Yii 是一个通用的 Web 编程框架,意味着它可以用于开发任意类型的 PHP Web 应用程序。由于它基于组件的架构和精致的缓存支持,它
特别适用于开发大型的应用程序,例门户,论坛,内容管理系统(CMS),电子商务项目,RESTful Web 服务等等。
Yii 是一个通用的 Web 编程框架,意味着它可以用于开发任意类型的 PHP Web 应用程序。由于它基于组件的架构和精致的缓存支持,它特别适用于开发大型应用程序,例如商业级应用,论坛,内容管理系统(CMS),电子商务项目,RESTful Web 服务等等。
Yii 和其他框架相比呢?
-------------------------------------------
- 和其他 PHP 框架类似,Yii 实现了 MVC(Model-View-Controller)设计模式并基于该模式组织代码。
- Yii 遵循一个哲学——代码要写的简单而又优雅。它永远不会为了要遵循某个设计模式而过度设计代码。
- Yii 是一个一站式框架,提供了大量经过验证的、入手可用的特性,例如:对关系型和NoSQL数据库都提供了查询构建器
(query builders)和 ActiveRecord;RESTful API 开发支持;多层缓存支持;还有更多。
- Yii 非常易于扩展。你可以自定义或替换几乎任何一处核心代码。你也会受益于它一致性的扩展架构,开发可再分发的扩展。
- Yii 遵循一个哲学 —— 代码要写的简洁而又优雅。它永远不会为了要迎合某个设计模式而过度设计代码。
- Yii 是一个一站式框架,提供了大量久经考验,开箱即用的特性,例如:对关系型和 NoSQL 数据库都提供了查询生成器(query builders)和 ActiveRecord;RESTful API 开发支持;多层缓存支持;以及更多。
- Yii 非常易于扩展。你可以自定义或替换几乎任何一处核心代码。你还会受益于它坚实的扩展架构,开发可再分发的扩展。
- 高性能始终是 Yii 的一个主要目标。
Yii 不是一场独角戏,它有一个[强大的开发者团队][]提供支持,也有一个庞大的专家社区,持续不断地对Yii的开发作出贡献。
Yii 开发者团队始终对 Web 开发最新潮流和其他框架及项目中的优秀实践和特性保持密切的关注,其他地方出现的最相关优秀实践及
特性会被不定期的整合进核心框架中,并提供简单优雅的接口。
Yii 不是一场独角戏,它有一个[强大的开发者团队][http://www.yiiframework.com/about/]提供支持,也有一个庞大的专家社区,持续不断地对Yii的开发作出贡献。Yii 开发者团队始终对 Web 开发最新潮流和其他框架及项目中的最佳实践和特性保持密切的关注,那些有意义的最佳实践及特性会被不定期的整合进核心框架中,并提供简单优雅的接口。
[强大的开发者团队]: http://www.yiiframework.com/about/
Yii 版本
------------
Yii 当前有两个主要版本:1.1 和 2.0。 1.1 版是一个旧版本,现在处于维护状态。2.0是一个彻底重写的 Yii,采用了最新的技术和协
议,包括 Composer,PSR,命名空间,trait 等等。 2.0 版本代表了最新一代的框架,是未来几年中的主力开发版本。本指南主要基于
Yii 当前有两个主要版本:1.1 和 2.0。 1.1 版是一个旧版本,现在处于维护状态。2.0 版是一个完全重写的版本,采用了最新的技术和协
议,包括 Composer,PSR,命名空间,trait 等等。 2.0 版代表了最新一代框架,是未来几年中我们的主要开发版本。本指南主要基于
2.0 版本编写。
系统要求和前置条件
系统要求和先决条件
------------------------------
Yii 2.0 需要 PHP 5.4.0 或以上版本支持。你可以通过运行任何 Yii 发行包中附带的系统要求检查器查看每个具体特性所需的 PHP 配
置。
使用 Yii 需要对面向对象编程(OOP)有基本的了解,因为 Yii 是一个纯面向对象的框架。
Yii 2.0 还是用了 PHP 的最新特性,例如 [命名空间](http://www.php.net/manual/en/language.namespaces.php)
[trait](http://www.php.net/manual/en/language.oop5.traits.php)
理解这些概念有助于你更快地掌握 Yii 2.0。
使用 Yii 需要对面向对象编程(OOP)有基本了解,因为 Yii 是一个纯面向对象的框架。Yii 2.0 还使用了 PHP 的最新特性,例如 [命名空间](http://www.php.net/manual/en/language.namespaces.php)
[trait](http://www.php.net/manual/en/language.oop5.traits.php)。理解这些概念有助于你更快地掌握 Yii 2.0。
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment