后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载Yii 2.0 是相对 1.1 的完全重写版本二者之间的差异远非一次简单的小版本升级可比。本文以官方《从 1.1 升级》指南乌兹别克语版 及其完整的 英文版为核心骨架结合本仓库的框架源码系统梳理从 1.1 迁往 2.0 时必须掌握的语言层变化、命名空间约定、对象体系重构以及视图、模型、控制器、Active Record 等每一层的用法变更帮助你快速定位存量代码的改造点。读完后你将能够依据明确的对照关系评估迁移工作量并按照 2.0 的新约定重写 1.1 时代的代码。升级总览为什么这不是一次普通的版本升级由于 Yii 2.0 对框架进行了彻底重写1.1 与 2.0 之间存在大量差异。因此从 1.1 升级并不像在两个小版本之间升级那样简单小版本之间的升级通常只涉及版本号首位数之后的数字变化。官方指南明确指出如果你从未使用过 Yii 1.1可以直接跳过本节从 快速入门 开始学习。同时需要强调Yii 2.0 引入的新特性远多于这份升级摘要所覆盖的内容。官方建议通读完整指南以了解全部新特性——很可能你过去需要自己动手实现的某些功能如今已经是框架核心代码的一部分。安装方式的根本变化全面拥抱 ComposerYii 2.0 完全建立在 ComposerPHP 的事实标准依赖管理工具之上。无论是安装核心框架还是安装扩展都统一通过 Composer 完成。这与 1.1 时代通过下载压缩包手动部署的方式截然不同。安装 Yii 2.0 的详细步骤参见 安装 Yii如何创建新扩展或将已有的 1.1 扩展改造为兼容 2.0 的扩展参见指南中的 创建扩展 一节。从仓库本身可以看到这种Composer 驱动的痕迹framework/composer.json 中声明了name: yiisoft/yii2、PSR-4 自动加载规则{yii\\: }并在bin字段中注册了yii可执行文件。根目录的 composer.json 与 composer.lock 则管理着框架开发与测试的完整依赖树。PHP 版本要求的变化从 5.2 到现代化语言特性官方文档撰写时 Yii 2.0 要求 PHP 5.4 或更高版本相比 1.1 所需的 PHP 5.2 是巨大的进步。随着版本演进当前仓库对 PHP 的要求已经进一步提高——framework/composer.json 的require段明确写着php: 7.4.0并依赖ext-mbstring、ext-ctype、lib-pcre等扩展。这意味着迁移到 2.0 不仅是代码层面的工作也包含运行环境的升级。因为 PHP 语言层面的差异迁移时需要注意以下主要变化命名空间NamespacesPHP 5.3 引入的命名空间机制是 2.0 类体系重构的基础匿名函数Anonymous functions用于事件处理器、回调等场景是 2.0 中非常常见的写法短数组语法[...elements...]取代了array(...elements...)短输出标签视图文件中使用?直接输出自 PHP 5.4 起无需任何配置即可安全使用SPL 类与接口标准 PHP 库提供的SplObjectStorage、SplFixedArray等可直接使用后期静态绑定Late Static Bindingsstatic::关键字Yii 的className()与实例化机制依赖于此日期时间类面向对象的DateTime、DateTimeZone等Trait特性PHP 5.4 引入的水平代码复用机制框架内部大量使用intl 扩展Yii 2.0 借助 PHP 的intl扩展PECL intl 模块来支撑国际化I18N能力例如日期、数字格式化等功能。命名空间革命去掉 C 前缀类名与目录结构一一对应Yii 2.0 最直观的变化是全面使用命名空间。几乎每个核心类都位于命名空间中例如yii\web\Request。类名中不再使用 1.1 时代的 C 前缀如CController、CWebUser。新的命名约定直接遵循目录结构yii\web\Request表示该类文件位于框架目录下的web/Request.php。这一点可以在仓库中得到印证——framework/web/Request.php 的第 9 行声明了namespace yii\web;而 framework/base/BaseObject.php 声明了namespace yii\base;。得益于 Yii 的类加载器你可以无需显式require/include任何类文件即可直接使用任意核心类。加载机制的关键证据framework/classes.php 是自动生成的类映射表将yii\base\BaseObject映射到YII2_PATH . /base/BaseObject.phpyii\web\Request映射到YII2_PATH . /web/Request.php等framework/BaseYii.php 中的autoload()方法约第 281 行会优先查static::$classMap找不到时再按命名空间规则解析路径并触发加载框架入口 framework/Yii.php 通过spl_autoload_register注册这一自动加载器。组件与对象CComponent 一分为二Yii 2.0 将 1.1 的CComponent类拆分为两个类[[yii\base\BaseObject]]轻量级基类支持通过 getter/setter 定义对象属性property。适用场景是仅表示基本数据结构的类[[yii\base\Component]]继承自BaseObject在属性能力之上增加了**事件events与行为behaviors**支持。应用组件、控制器、模型等核心类均以它为根基。如果你的类不需要事件或行为特性官方建议优先使用BaseObject作为基类——这通常适用于承载基础数据的类。从源码看framework/base/Component.php 的类注释明确写着Component 在父类 BaseObject 实现的 property 特性之外额外提供 event 与 behavior 特性framework/base/BaseObject.php 则实现了__get、__set、__isset、__unset等魔术方法把getLabel()/setLabel()这样的方法对映射为可读写的label属性。关于属性与组件体系的完整讲解参见指南中的 属性Properties、事件Events 与 行为Behaviors 三节。统一的对象配置约定构造器 init() Yii::createObject()BaseObject类为对象配置建立了一套统一约定。任何继承BaseObject的子类如果需要自定义构造器应当按照下面的模板声明以便被正确配置class MyClass extends \yii\base\BaseObject { public function __construct($param1, $param2, $config []) { // ... 配置应用之前的初始化声明并赋值 parent::__construct($config); } public function init() { parent::init(); // ... 配置应用之后的初始化 } }约定要点构造器的最后一个参数必须是配置数组$config默认[]其中包含用于初始化对象属性的键 值对在构造器末尾调用parent::__construct($config)重写init()方法来执行配置已应用之后的初始化工作。从源码可以验证这一生命周期framework/base/BaseObject.php 的构造函数实现为——若$config非空则调用Yii::configure($this, $config)内部即BaseYii::configure()位于 framework/BaseYii.php 第 560 行附近逐个把配置键值赋给对象属性随后调用$this-init()。也就是说对象的完整创建流程是构造器 → 按配置初始化属性 → init()官方强烈建议把真正的初始化逻辑放进init()因为此时配置已经应用完毕。遵循这一约定后你可以用配置数组来创建并配置新对象$object Yii::createObject([ class MyClass, property1 abc, property2 cde, ], [$param1, $param2]);这里Yii::createObject()实际调用BaseYii::createObject()framework/BaseYii.php 第 348 行附近它通过依赖注入容器static::$container-get($type, $params)完成实例化与配置。关于配置的更多细节参见指南的 配置Configurations 一节。事件系统重构任意事件名 on()/off()/trigger()在 Yii 1 中事件通过定义on开头的方法来创建如onBeforeSave事件名被硬编码为方法名。Yii 2 中你可以使用任意事件名并通过trigger()触发$event new \yii\base\Event; $component-trigger($eventName, $event);通过on()方法挂载事件处理器$component-on($eventName, $handler); // 解除挂载使用 // $component-off($eventName, $handler);事件体系还有大量增强。例如 framework/base/Component.php 的类注释展示了四种可挂载的处理器类型匿名函数、对象方法、静态类方法、全局函数并支持通过配置数组以on add function ($event) {...}的语法在组件配置时直接挂载事件、通过$event-data携带附加数据。事件处理器按挂载顺序依次调用。完整讲解参见 事件Events 一节。路径别名扩展到 URL 并强制以 开头Yii 2.0 将路径别名的使用范围从文件/目录路径扩展到 URL并且强制要求别名以字符开头以区别于普通路径或 URL。例如别名yii指向 Yii 的安装目录。路径别名在框架核心代码中被广泛支持。例如 [[yii\caching\FileCache::cachePath]] 既可以接收路径别名也可以接收普通目录路径。路径别名与类命名空间关系密切。官方建议为每个根命名空间定义路径别名这样无需额外配置即可使用 Yii 类自动加载器。例如因为yii指向 Yii 安装目录yii\web\Request这样的类才能被自动加载。如果你使用第三方库如 Zend Framework只需为它定义Zend别名指向其安装目录Yii 便能自动加载该库中的任何类。源码层面的实现framework/BaseYii.php 第 83 行默认注册了yii __DIR__getAlias()约第 135 行会先判断字符串是否以开头非别名直接原样返回setAlias()约第 221 行在别名未带时会自动补上。展开规则是最长前缀优先例如同时注册foo与foo/bar时解析foo/bar/config会命中foo/bar。详见指南的 别名Aliases 一节。视图层重构$this 从控制器变为视图对象Yii 2 视图层最重大的变化是视图中的特殊变量$this不再指向当前控制器或小部件而是指向一个视图对象类型为 [[yii\web\View]]代表 MVC 中的 View 部分。若在视图中需要访问控制器或小部件使用$this-context。在视图中渲染另一个局部视图使用$this-render()而非 1.1 的$this-renderPartial()。而且render()现在返回渲染结果而非直接输出因此必须显式 echoecho $this-render(_item, [item $item]);除了以 PHP 作为主要模板语言Yii 2.0 还官方支持 Smarty 与 Twig 两种流行模板引擎Prado 模板引擎则不再支持。使用这些模板引擎需要在view应用组件上配置 [[yii\base\View::$renderers|View::$renderers]] 属性。详见指南的 模板引擎Template Engines 一节。模型与场景scenarios() 取代隐式安全规则Yii 2.0 使用 [[yii\base\Model]] 作为模型基类对应 1.1 的CModel而CFormModel类被彻底移除——在 2.0 中创建表单模型应直接继承Model。2.0 引入新方法 [[yii\base\Model::scenarios()|scenarios()]] 来声明支持的场景并标明某个属性在何种场景下需要校验、是否属于安全属性可被批量赋值。例如public function scenarios() { return [ backend [email, role], frontend [email, !role], ]; }上述代码声明了两个场景backend与frontend。在backend场景下email和role都是安全属性可被批量赋值在frontend场景下只有email可被批量赋值role不可以!前缀表示不安全。两个属性都应通过校验规则进行验证。[[yii\base\Model::rules()|rules()]] 方法仍然用于声明校验规则。需要注意由于scenarios()的引入不再有unsafe校验器。在大多数情况下如果rules()已完整描述了场景且无需声明不安全属性你就不需要重写scenarios()。详见指南的 模型Models 一节。控制器动作改为返回渲染结果Yii 2.0 以 [[yii\web\Controller]] 作为控制器基类对应 1.1 的CController[[yii\base\Action]] 是动作类的基类。这些变化对存量代码最明显的影响是控制器动作应当返回要渲染的内容而不是直接 echo 输出public function actionView($id) { $model \app\models\Post::findOne($id); if ($model) { return $this-render(view, [model $model]); } else { throw new \yii\web\NotFoundHttpException; } }动作没有返回值或返回null时响应内容为空需要输出时一律 return。详见指南的 控制器Controllers 一节。小部件begin() / end() / widget() 静态方法语法Yii 2.0 以 [[yii\base\Widget]] 作为小部件基类对应 1.1 的CWidget。为获得更好的 IDE 支持2.0 引入了新的静态方法语法[[yii\base\Widget::begin()|begin()]]、[[yii\base\Widget::end()|end()]]、[[yii\base\Widget::widget()|widget()]]use yii\widgets\Menu; use yii\widgets\ActiveForm; // 注意必须 echo 结果才能显示 echo Menu::widget([items $items]); // 传入数组来初始化对象属性 $form ActiveForm::begin([ options [class form-horizontal], fieldConfig [inputOptions [class input-xlarge]], ]); ... 表单输入字段 ... ActiveForm::end();这种写法的好处是widget()返回渲染结果由调用方决定如何输出begin()/end()配合用于需要在两处之间输出大量内容的小部件如表单。详见指南的 小部件Widgets 一节。主题基于路径映射机制成为 view 组件的属性2.0 中的主题机制与 1.1 完全不同改为基于路径映射把源视图文件路径映射到主题化视图文件路径。例如某主题的路径映射为[/web/views /web/themes/basic]则视图文件/web/views/site/index.php的主题化版本为/web/themes/basic/site/index.php。正因为如此主题现在可以作用于任何视图文件——即使该视图是在控制器或小部件上下文之外渲染的。另外不再有CThemeManager组件。取而代之的是theme成为view应用组件的一个可配置属性。详见指南的 主题Theming 一节。控制台应用控制器化 路由化控制台应用现在与 Web 应用一样按控制器组织。控制台控制器应继承 [[yii\console\Controller]]对应 1.1 的CConsoleCommand。运行控制台命令使用yii route其中route是控制器路由例如sitemap/index。额外的匿名参数会作为参数传给对应的控制器动作方法而具名参数则依据 [[yii\console\Controller::options()]] 的声明进行解析。Yii 2.0 还支持从注释块自动生成命令帮助信息。仓库中提供了开箱即用的 yii 入口脚本。详见指南的 控制台命令Console Commands 一节。I18N内置格式化器让位于 intl消息翻译收敛到 i18n 组件Yii 2.0 移除了内置的日期格式化器和数字格式化器改用 PECL 的 intl PHP 模块这也解释了前文 PHP 要求中必须关注intl扩展的原因。消息翻译现在通过i18n应用组件完成。该组件管理一组消息源message sources允许你根据消息类别使用不同的消息源。详见指南的 国际化Internationalization 一节。动作过滤器通过行为实现动作过滤器在 2.0 中改为通过行为实现。要定义新的自定义过滤器继承 [[yii\base\ActionFilter]]要使用过滤器则把过滤器类作为行为附加到控制器上。例如要在控制器中使用 [[yii\filters\AccessControl]]public function behaviors() { return [ access [ class yii\filters\AccessControl, rules [ [allow true, actions [admin], roles []], ], ], ]; }上述规则允许已登录用户表示已认证用户访问admin动作。这印证了前文所述Component 支持行为的价值——过滤器正是行为的典型应用。详见指南的 过滤器Filtering 一节。资源asset bundle 取代脚本包概念Yii 2.0 引入名为asset bundle资源包的新概念取代 1.1 的脚本包script package概念。资源包是位于某个目录下的一组资源文件如 JavaScript 文件、CSS 文件、图片等的集合。每个资源包用继承 [[yii\web\AssetBundle]] 的类表示。通过 [[yii\web\AssetBundle::register()]] 注册资源包即可让包内资源通过 Web 可访问。与 1.1 不同注册了资源包的页面会自动包含包中声明的 JavaScript 与 CSS 文件引用。详见指南的 资源管理Managing Assets 一节。助手类常用静态工具类集中提供Yii 2.0 引入了一批常用的静态助手类包括[[yii\helpers\Html]][[yii\helpers\ArrayHelper]][[yii\helpers\StringHelper]][[yii\helpers\FileHelper]][[yii\helpers\Json]]这些类位于 framework/helpers 目录下提供了 HTML 生成、数组处理、字符串处理、文件操作、JSON 编解码等高频能力。详见指南的 助手概览Helper Overview 一节。表单引入 field 概念Yii 2.0 引入field字段概念用于基于 [[yii\widgets\ActiveForm]] 构建表单。一个 field 是包含标签label、输入控件input、错误消息error message和/或提示文本hint text的容器由 [[yii\widgets\ActiveField|ActiveField]] 对象表示。借助 field可以更简洁地构建表单?php $form yii\widgets\ActiveForm::begin(); ? ? $form-field($model, username) ? ? $form-field($model, password)-passwordInput() ? div classform-group ? Html::submitButton(Login) ? /div ?php yii\widgets\ActiveForm::end(); ?每一行$form-field($model, attribute)即可同时输出标签、输入框与校验错误信息。详见指南的 创建表单Creating Forms 一节。查询构建器统一的 Query 对象在 1.1 中查询构建分散在CDbCommand、CDbCriteria、CDbCommandBuilder等多个类中。Yii 2.0 用 [[yii\db\Query|Query]] 对象统一表示数据库查询并在后台借助 [[yii\db\QueryBuilder|QueryBuilder]] 将其转换为 SQL 语句。例如$query new \yii\db\Query(); $query-select(id, name) -from(user) -limit(10); $command $query-createCommand(); $sql $command-sql; $rows $command-queryAll();更棒的是这些查询构建方法同样适用于 Active Record。详见指南的 查询构建器Query Builder 一节。Active RecordActiveQuery 取代 CDbCriteriaYii 2.0 对 Active Record 引入了大量变化最明显的两点涉及查询构建与关联查询处理。1.1 的CDbCriteria被 [[yii\db\ActiveQuery]] 取代。该类继承自Query因此继承了全部查询构建方法。通过 [[yii\db\ActiveRecord::find()]] 开始构建查询// 取出所有 status 为 $active 的客户并按 id 排序 $customers Customer::find() -where([status $active]) -orderBy(id) -all();声明关联只需定义一个返回 [[yii\db\ActiveQuery|ActiveQuery]] 对象的 getter 方法getter 定义的属性名即关联名。例如下面声明了一个orders关联在 1.1 中需要在集中的relations()方法中声明class Customer extends \yii\db\ActiveRecord { public function getOrders() { return $this-hasMany(Order, [customer_id id]); } }现在可以用$customer-orders访问客户的订单。也可以用带自定义查询条件的即时关联查询$orders $customer-getOrders()-andWhere(status1)-all();预加载eager loading在 2.0 中的实现方式与 1.1 不同1.1 会创建 JOIN 查询同时取出主记录与关联记录2.0 则执行两条 SQL 语句而不使用 JOIN——第一条取出主记录第二条用主记录的主键过滤取出关联记录。当需要返回大量记录时可以在查询链上追加 [[yii\db\ActiveQuery::asArray()|asArray()]] 方法让查询结果以数组形式返回从而显著降低 CPU 时间与内存占用$customers Customer::find()-asArray()-all();另一个变化是不能再通过 public 属性定义属性的默认值。如果需要默认值应在记录类的init()方法中设置public function init() { parent::init(); $this-status self::STATUS_NEW; }1.1 中重写 ActiveRecord 类构造器存在一些已知问题2.0 已不再存在。注意当为构造器添加参数时可能需要重写 [[yii\db\ActiveRecord::instantiate()]]。Active Record 行为2.0 移除了基类CActiveRecordBehavior。创建 Active Record 行为需要直接继承yii\base\Behavior若行为类需要响应所属对象owner的事件则重写events()方法namespace app\components; use yii\db\ActiveRecord; use yii\base\Behavior; class MyBehavior extends Behavior { // ... public function events() { return [ ActiveRecord::EVENT_BEFORE_VALIDATE beforeValidate, ]; } public function beforeValidate($event) { // ... } }用户认证IdentityInterface 取代 CUserIdentity1.1 的CWebUser被 [[yii\web\User]] 取代且不再有CUserIdentity类。取而代之的是实现 [[yii\web\IdentityInterface]]使用方式更加直观高级项目模板advanced project template提供了此类示例。详见指南的 认证Authentication 与 授权Authorization 两节。URL 管理支持可选参数路由命名转小写连字符Yii 2 的 URL 管理与 1.1 类似一个重要增强是支持可选参数。例如下面的规则可以同时匹配post/popular与post/1/popular——在 1.1 中要达到同样效果需要两条规则[ pattern post/page:\d/tag, route post/index, defaults [page 1], ]路由命名约定也有一处重要变化控制器和动作的驼峰命名camel case会转换为小写并用连字符分隔例如CamelCaseController的控制器 ID 为camel-case。详见指南的 URL 管理Url manager docs 一节以及 控制器 ID 与动作 ID 的相关说明。迁移实战如何让 1.1 与 2.x 共存如果存在希望与 Yii 2.0 共存的遗留 1.1 代码可参考指南的 同时使用 Yii 1.1 与 2.0Using Yii 1.1 and 2.0 Together 一节。该节提供了在同一个应用中渐进式迁移的策略使你不必一次性重写全部存量代码。小结从 1.1 升级到 2.0 的本质是按新架构重写而非局部修补。核心要点可归纳为语言层PHP 5.2 → PHP 5.4当前仓库要求 PHP 7.4.0命名空间、匿名函数、Trait、intl 等新特性全面可用类体系CComponent拆分为BaseObject属性与Component事件 行为C 前缀消失类名与目录一一对应配置约定构造器末尾参数为$config数组 init()完成后续初始化 Yii::createObject()统一创建MVC 各层视图$this变为视图对象、动作返回渲染结果、scenarios()取代隐式安全规则、小部件使用静态方法语法、主题改为路径映射数据层Query/ActiveQuery统一查询构建、预加载不再使用 JOIN、asArray()优化大数据量读取基础设施Composer 驱动安装、asset bundle 取代脚本包、i18n 组件统一消息翻译、过滤器行为化。建议在动手迁移前通读本文引用的各专题章节完整英文指南、乌兹别克语指南并结合仓库源码framework 目录与 tests 目录中的测试用例验证每个 API 的实际行为制定分模块、可验证的迁移计划。赞分享后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载相关推荐Yii 2 从 1.1 升级完全指南核心架构重写与迁移实战yii2 官方文档详解Yii 2 从 1.1 升级完全指南核心架构重写与迁移实战yii2 官方文档详解 本指南以官方文档 docs/guide pt BR/intro upgr后端Web框架Yii 2.0 从 1.1 升级完全指南Yii 2 框架核心差异、重构要点与迁移实战Yii 2.0 从 1.1 升级完全指南Yii 2 框架核心差异、重构要点与迁移实战 Yii 框架为 2.0 版本进行了彻底重写因此 1.1 与 2.0 之后端Web框架从 Yii 1.1 升级到 Yii 2.0核心差异全解析与迁移实战指南从 Yii 1.1 升级到 Yii 2.0核心差异全解析与迁移实战指南 Yii 2.0 对框架进行了完全重写从 1.1 升级并非简单的版本号跨越而是一次架后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
