深入理解Yii2.0 导读


深入理解Yii2.0 导读


目录

《深入理解Yii2.0》

导读

Yii是什么
Yii2.0的亮点
背景知识
如何阅读本书

Yii基础

属性(Property)
事件(Event)
行为(Behavior)

Yii约定

Yii应用的目录结构和入口脚本
别名(Alias)
Yii的类自动加载机制
环境和配置文件
配置项(Configuration)

Yii模式

MVC
依赖注入和依赖注入容器
服务定位器(Service Locator)

请求与响应(TBD)

路由(Route)
Url管理
请求(Reqeust)
Web应用Request

Yii与数据库(TBD)

数据类型
事务(Transaction)
AcitveReocrd事件和关联操作
乐观锁与悲观锁

《深入理解Yii2.0》视频教程

第一讲:基础配置
第二讲:用户登录
第三讲:文章及评论的模型

附录

附录1:Yii2.0 对比 Yii1.1 的重大改进
附录2:Yii的安装

导读

《深入理解Yii2.0》是一本干货。主要讲解Yii2.0及所代表的最新一代Web开发框架的新特性、新技术、新理念、新模式。 采用的方式是分析框架的源代码,尝试从根上进行理解和阐述,并融入个人使用Yii开发的一些经验和教训。 通过本书,你将不仅仅了解到Yii怎么使用的实操技巧,还将掌握其实现的技术原理和内幕。 更为重要的是,接触当前Web开发中最为流行又相对成熟的设计模式和开发思路。 衷心希望读者朋友们通过本书能有所收获。

Yii是什么

Yii是一个PHP框架,用于开发各种类型的Web应用。Yii官方将其定义为高性能、基于组件的框架。

就个人的经验而言,总结Yii具有以下特点:

Yii比较“潮”。

Yii开发团队一直关注业内Web开发的最新技术,很注意吸收当下最为流行的技术。 可以说, 近年来Web开发中最潮的技术都可以在Yii身上或多或少的看到影子。 比如,刚刚开始的时候Yii带有明显的Ruby on Rails风格; 比如Yii2中刚刚实现的命名空间等PHP最新特性支持等。 一个跟得上潮流和趋势的框架, 才具有吸引力和生命力,学习起来才有意思、有意义。

Yii比较“易”。

正如其名字的发音,Yii是一个比较易学、易用的框架。代码质量很高,有许多可以学习的地方。 注释清晰、文档丰富阅读代码难度不高。社区活跃,官方论坛有中文区,国内论坛人气也还OK,知识获取容易。 架构相对稳定,从Yii1.1到Yii2的变化看,许多原来的约定和沉淀的经验都还适用。

Yii比较“全”。

就Web开发而言,无论是哪种类型的应用、无论是哪个开发阶段的常见问题,Yii都有成熟、高效、可靠的解决方案。 对于典型的Web开发而言,这已经是足够了。比如,伪静态化、国际化、RESTful等,Yii都有提供编程的框架。 但是,从规模上来讲,Yii还算不上一个大型框架。 个人对其的评价是一个中型偏轻点的框架, 对于绝大多数的应用开发而言,肯定是充分、够用的了。

Yii比较“快”。

Yii官方把运行效率作为一个重要的特点来宣传。从实际使用看,在诸多PHP框架中,确实效率上具有一定优势。 但个人认为这点其实不是最重要的特点。对于框架的使用者,也就是开发人员来讲,更重要的是开发效率。 由于Yii架构合理,Web开发中常用的思路和模式都可以很顺地套上使用。 在Web开发中经常遇到的一些细节上的问题, Yii也提供了许多现成解决方案,拿来就可以使用,非常高效、方便。 开发效率高,对于开发者、开发团队而言,更为重要。

要感谢Yii开发团队精益求精的不懈努力,为广大Web开发者创造了如此优秀的框架。 本人自Yii1.1起就开始接触并使用Yii了, 由于工作和爱好关系,也接触过一些框架了。总的说,至今对Yii很满意, 最最心仪的是两点:学了Yii, 就学到了许多当下最流行、最成熟的东西;开发起快,改进来快。

Yii2.0的亮点

Yii有两个最主要的版本:Yii1.1和Yii2.0。Yii1.1是老的版本,在写这本书时,最新版本号是1.1.15。 Yii1.1现在已经不再进行新的开发了,官方只是进行维护,更新安全漏洞等,不会再有新的功能特性的引入。 而Yii2.0是在Yii1.1的基础上完全推倒重新写的一个框架,吸收了许多当前最新的技术和开发中的主流约定, 是最新一代Web开发框架的代表。 附录1:Yii2.0 对比 Yii1.1 的重大改进 部分介绍了Yii2.0对比Yii1.1的重大改进。 下面我们简单介绍Yii2.0的一些比较突出的特点:

Yii2.0的一些比较突出的特点:

  • 运用了PHP命名空间、Trait、 PSR标准 、Composer和Bower包管理器, 等新技术新标准。
  • 实现了 依赖注入和依赖注入容器 以及 服务定位器(Service Locator) 等新架构新模式。
  • Yii2.0额外重视安全性,采取一系列手段有效防止SQL注入、XSS攻击、CSRF攻击、cookie篡改等。
  • 广泛支持各类SQL和NOSQL数据库,高效实现了Active Record等数据库查询、操作界面,提供数据库迁移、复制、 读写分离等功能。
  • 只需极少量的代码就可以实现完全符合标准的RESTful API。
  • 支持各种粒度、介质的缓存机制。
  • 提供多种认证和授权手段基于cookie和基于令牌的认证,RBAC等权限控制手段,支持OpenID,OAuth1,OAuth2等。
  • 支持Bootstrap,jQuery UI,提供了丰富的Widget挂件供使用。
  • 完善的国际化支持,提供符合 ICU标准 的时间、 复数等格式化工具和消息翻译、视图翻译等功能。
  • 除了支持Twig和Smarty 2个主流的PHP模版引擎外,开发者还可以自己写扩展支持其他引擎。
  • 为苦命码农提供了 Yii调试工具条Gii代码生成器 以及 文档生成器 等高效开发工具。
  • 集成了 Codeception 和 Faker,并与DB Migration相结合,提供了一个fixture框架,方便测试开发。
  • 提供了一个简单应用模板和高级应用模板,适用于不同的开发场景,都可以帮助开发者尽快搭建起自己的应用。

详细的Yii2.0功能特性,请查看 官方说明

背景知识

请留意,虽然本书以Yii2为主要内容,但并不要求读者具有Yii1.1的开发经验。 虽然具有这些背景知识可以更快的掌握Yii2, 但在讲解过程中,本书会帮助没有Yii1.1相关知识的读者补充有关的概念。 只要有了这些概念, 读者并不需要从头学习Yii1.1,就可以直接上手Yii2了。

当然,Yii作为一个PHP框架,读者朋友最好能够了解一下PHP,并不需要多精通,只需要看得懂代码,会写简单的代码, 编程的时候大概知道要使用哪些函数,就基本足够了,边用边学,也是一种学习方法。

同时,Yii还是一个面向对象的框架。这意味着在代码组织和问题解决的思路上,Yii都体现了面向对象的思想。 要用Yii来开发,最好也要遵循这一思想。因此,读者最好对面向对象编程有一定的了解。 其实,看一个程序员水平的高低, 不单是对于某种语言、某种开发框架的熟练程度。 更重要的,是看其解决问题的思路和方法。其中一大类方法就是面向对象方法。 从这点来看,虽然学习和使用Yii并不需要多高深的面向对象的方法。 但作为过来人,还是希望各位读者朋友可以系统地、 全面地学习面向对象的开发方法。 特别是Web开发中常用的设计模式,本书也会在涉及到时,进行专门讲解。

如何阅读本书

这不是一本“快速入门”、“一周精通”的书,本书的一个非常重要的目的和出发点是剖析Yii2.0的原理,使读者既知其然, 又知其所以然,这就注定了不可能一蹴而就。书中有大量的代码,需要剖析数据结构、追溯调用堆栈、跟踪代码流程。 虽然我们力求生动、简洁,但读者朋友们还是要有“古佛青灯”的心理准备,不浮、不躁,潜心练好内功,扎实锤炼底子, 早日练成绝活。

在内容上,本书直指Yii2.0的本质,求精不求全,对于相关的PHP、HTTP等诸多知识最多在讲到时点一点,浅偿辄止, 没能够展开介绍。因此,对于涉及到的关联知识、背景知识,要充分利用搜索引擎等工具,进行自学和补充。

在篇章结构上,本书总体上按照逐步深入的格局安排内容。同时,各部分的内容又保持相对独立, 尽量做到每个单独页面的内容, 都可独立成篇。 因此,初次接触Yii2.0的读者朋友,建议循序渐进,依次阅读。 而具有一定基础的读者则可以根据个人兴趣爱好,自由选择学习切入点,在遇到有疑问的知识点时, 再按图索骥查找相关的页面。

在 Yii 基础 部分,依次介绍了 属性(Property) ,事件(Event) ,行为(Behavior) 等Yii中最基础的知识, 是理解整个Yii框架的最基本的概念。

在 Yii 约定 部分,主要讲解了Yii约定俗成的一些套路、设定,解决的是在开发者未作任何指定的情况下, Yii的默认行为方式的问题, 用于加深对Yii实际使用的理解。这一部分主要包括 Yii应用的目录结构和入口脚本 , 别名(Alias) , Yii的类自动加载机制 , 环境和配置文件 , 配置项(Configuration) 等内容。

在 Yii 模式 部分,剖析了Yii是如何实现一些当前Web开发中最主流和成熟的设计模式。 学习这些设计模式,有助于深入理解Yii的机制, 更难得的是提高读者朋友自身的开发设计水平。 这一部分主要讲了 MVC , 依赖注入和依赖注入容器 , 服务定位器(Service Locator) 三种设计模式。

Yii2 核心类继承关系

Yii2 运行流程

Yii2的执行过程,或者运行流程:

  1. 用户向 入口脚本 web/index.php 发起请求。
  2. 入口脚本加载应用 配置 并创建一个 应用 实例去处理请求。
  3. 应用通过 请求 组件解析请求的 路由。
  4. 应用创建一个 控制器 实例去处理请求。
  5. 控制器创建一个 动作 实例并针对操作执行过滤器。
  6. 如果任何一个过滤器返回失败,则动作取消。
  7. 如果所有过滤器都通过,动作将被执行。
  8. 动作会加载一个数据模型,或许是来自数据库。
  9. 动作会渲染一个视图,把数据模型提供给它。
  10. 渲染结果返回给 响应 组件。
  11. 响应组件发送渲染结果给用户浏览器。

请求生命周期:

运行流程:

index.php
 2     ---->引入 vendor/auto_load.php
 3 auto_load.php
 4     ---->引入 ventor/composer/autoload_real.php
 5     ---->执行 ComposerAutoloaderInit240f916b39e20bc11bc03e2039805bd4->getLoader
 6 autoload_real.php
 7     ---->getLoader
 8     ---->单例
 9     ---->spl_autoload_register(array('ComposerAutoloaderInit240f916b39e20bc11bc03e2039805bd4','loadClassLoader'))
10     ---->self::$loader = new \Composer\Autoload\ClassLoader();
11     ---->引入 \Composer\Autoload\ClassLoader
12     ---->引入 autoload_namespaces.php 给作为属性 $loader
13         ---->$vendorDir  $baseDir
14     ---->引入 autoload_psr4.php 作为属性给 $loader
15     ---->$loader->register(true);
16         ---->spl_autoload_register this,loadClass
17         ---->loadClass ----> findFile 
18     ---->引入 autoload_files.php require
19     ---->return $loader
20 index.php
21     ---->初始化了一个$loader  (暂时不知道什么用)
22     ---->引入 /vendor/yiisoft/yii2/Yii.php
23 Yii.php
24     ----> 引入 BaseYii.php ,Yii 继承 BaseYii
25     ---->spl_autoload_register(BaseYii,autoload)
26     ---->Yii::$classMap = include(__DIR__ . '/classes.php'); //引入一堆php class地址
27     ---->Yii::$container = new yii\di\Container;//容器
28  
29 //继承关系梳理
30     yii\di\Container(容器) -> yii\base\Component(实现 属性,事件,行为 功能的基类) -> Object(实现 属性 功能的基类,含有__construct)
31     yii\web\Application(所有web应用类的基类) -> \yii\base\Application(所有应用的基类,__construct) -> Module(所有模块和应用的基类,含有__construct) -> yii\di\ServiceLocator(服务定位器,包含所有模块和应用) -> yii\base\Component -> Object
32  
33 index.php
34     ---->$config 引入 
35     (new yii\web\Application($config))->run();
36     ---->\yii\base\Application __construct()
37         ---->Yii::$app = $this (Application)
38         ---->$this->setInstance($this); 设置当前请求类的实例 (把Application类的对象push进Yii的loadedModules里)
39         ---->$this->preInit($config);
40             ---->$this->_basePath = $_config['basepath']  Yii::aliases[@app] = $_config['basepath']
41             ---->$this->getVendorPath 设置框架路径
42                 ---->setVendorPath Yii::aliases[@vendor] Yii::aliases[@bower] Yii::aliases[@npm]
43             ---->$this->getRuntimePath 同上,设置runtimePath Yii::aliases[@runtime]
44             ---->setTimeZone 设置时区
45             ---->核心组件信息(地址)注入$config log view formatter i18n mailer urlManager assetManager security
46         ---->registerErrorHandler 定义错误处理程序
47         ---->Component::__construct($config); Object中的__construct  //这步发生了很多事情
48             ---->Yii::configure($this)  把$config赋给$this作属性
49  
50             ? $this->bootstrap 中的值哪来的 ?---->配置文件来的。。。。
51  
52         ---->$this->init()
53         ---->$this->bootstrap(); 初始化扩展和执行引导组件。
54             ---->引入@vendor/yiisoft/extensions.php
55             ---->Yii::aliases['xxx'] = 'xxx'; extensions.php中aliase地址
56         <!-- 初始化完成 -->
57  
58     ---->\yii\base\Application->run()
59         ---->$this->trigger($name)  --- $event = new Event;  //$name = beforeRequest 执行 _event[beforeRequest]handler
60             ---->$event->sender = application object
61                  $event->name = $name;
62                  //这两句没懂
63                  $event->data = $handler[1];
64                  call_user_func($handler[0], $event);
65                  Event::trigger($this, $name, $event); //$this = application object 
66  
67         ---->$response = $this->handleRequest($this->getRequest());
68             ---->$this->getRequest() ---->get('request') get方法位于ServiceLocator ,返回指定id的实例(返回request实例到_components['request'])
69             ---->$this->handleRequest(request对象) //request对象的类是yii/web/request
70                 ---->list ($route, $params) = $request->resolve();//解决当前请求的路由和相关参数 ,resolve() 调用 UrlManager对象 的 parseRequest() 方法,再在里面调用 UrlRule类的 parseRequest()
71                     ---->$params 放置地址栏解析的结果数组Array ( [0] => [1] => Array ( [m] => sds [c] => dasd ) )
72                     ---->runAction($route, $params); //位于Module
73                         ---->list($controller, $actionID) = $this->createController($route) 返回array('0'=>控制器controller对象,'1'=>'action名') 
74                         $controller 赋给Yii::$app->controller
75                         ---->$controller->runAction($actionID, $params);  yii/base/Controller
76  
77                         ---->runAction($actionID, $params);  yii/base/Controller
78                             ---->$action = $this->createAction($id); //生成一个InlineAction对象,赋给Yii::$app->requestedAction
79                                 InlineAction __construct $this->actionMethod = $actionMethod;
80                             ---->beforeAction
81                             ---->$action->runWithParams($params); //位于 yii/base/InlineAction
82                                 ---->$args = $this->controller->bindActionParams($this, $params);//位于yii/web/controller $this=>InlineAction $params=>模块/控制器 数组  --- 将参数绑定到action,返回有效参数数组$args
83                                 ---->赋给Yii::$app->requestedParams = $args;
84                                 ---->call_user_func_array([$this->controller, $this->actionMethod], $args) //执行第一个回调函数 真正执行
85                             ---->afterAction
86                             ---->返回执行结果(页面已出) 给Module中的runAction
87  
88         ---->返回结果给handleRequest
89         ---->$response = $this->getResponse(); 返回一个response对象,具体同上
90         ---->$response->data = $result;  
91         ---->返回$response给yii/base/Application 的 run $response
92         ---->$response->send();输出内容
93         <!-- 页面输出完成 -->

参阅:

https://www.php.cn/faq/390228.html

https://www.jianshu.com/p/5b80f08cbf57






参考资料

深入理解Yii2.0 » 导读 http://www.digpage.com/preface.html

深入理解Yii2.0 https://www.kancloud.cn/kancloud/yii-in-depth

深入理解Yii2.0 https://www.shouce.ren/api/view/a/9360

Yii 2.0.0 is released https://www.yiiframework.com/news/81/yii-2-0-0-is-released

Yii官网 https://www.yiiframework.com/

Yii 2.0 GitHub Project https://github.com/yiisoft/yii2

Yii 2.0 权威指南 https://www.yiiframework.com/doc/guide/2.0/zh-cn

Yii 2.0 class reference https://www.yiiframework.com/doc/api/2.0/index

yii2/docs/guide-zh-CN 中文文档 https://github.com/yiisoft/yii2/tree/master/docs/guide-zh-CN

Yii 2.0 Community Cookbook https://github.com/samdark/yii2-cookbook

深入理解PHP内核 https://www.kancloud.cn/kancloud/php-internals


返回