Yii2 框架是一个非常庞大但是并不臃肿的 php 框架。

使用 Yii2 框架,可以极大的提升开发效率。

秉持着要知其然也要知其所以然的思想,花了一周的时间,看了 linuor 的 《深入理解Yii2.0》

根据我的理解梳理了一下 Yii2 框架的整体结构。

此后简称框架。

1. Yii 框架基础

此框架的三个基础概念:

  • 属性
  • 事件
  • 行为

毕竟三生万物。

1.1 属性

一看到这个词可能很迷惑,那么什么是属性呢。

比如说,你现在正在玩一款角色扮演的游戏,角色双手分别有一把 十方大剑 ,一个 十方盾牌

那么从面向对象的角度而言,你的角色类需要有 左手武器右手武器 两个成员变量。

并且角色类可以从 左手武器右手武器 中获得 力量属性。

这么一说属性这一概念,就很容易理解了。

1.2 事件

还是以角色扮演游戏为例(这里要对不起不玩游戏的朋友了,原谅我匮乏的想象力,或者你有好的比喻也可以跟我说),游戏里面都有任务系统,而任务会分为主线任务和支线任务,在做主线任务是通常会触发一系列的支线任务。这些支线任务的触发就可以认为是一系列的事件。

1.3 行为

框架的行为也可以使用角色扮演游戏来举例,你在 无尽荒原 捡到了一本魔法书,学会了禁咒魔法,召唤神龙

于是你把程序一改,给你的类加一个召唤魔法的方法,这是不可能的。我们必须让你的类拥有一个动态添加方法的功能,于是所有拿到魔法书的人或者限定职业的人,都能学会这个禁咒,这就是 行为 的作用,动态给类增加方法。

以上,有了这三个 框架 实现的武器,我们才能更快速和灵活的搭建上层的程序。

2. 设计模式

2.1 依赖注入

框架采用了现在世面上面最常见的一种模式, MVC 模式,具体细节不再阐述,现在网上关于 MVC 的介绍可以说是烂大街了。

MVC 只是一种大框架上的设计模式,其核心思想是分层,最终目的是解耦。框架在 MVC 的基础上,应用了很多经典的设计模式以及后来发展的设计模式。

其中最重要的就是:

  • 依赖注入
  • 服务定位器。

那么什么是依赖注入呢

先来一段没有依赖注入的代码:

<?php
// 这段代码将 db1 中的t1表的数据备份到 db2 库的 t2 中。
// 所使用的变量都在逻辑过程中申请。
class Archive {
public function doArchive() {
$dataDB = new DB1(); $data = $dataDB->query("select * from t1"); $backDB = new DB2(); foreach ($data as $key => $value) {
$backDB->query("insert into t2 values ". implode(',', $value));
} die("备份完成");
}
}

那么如果再来一个需求,让你把 db3 的数据备份到 db4 中,逻辑相同,那么你该怎么办呢?

有道友就说了,那还不简单, copy & paste,搞定。

于是,你多了一个方法或者一个类。

一直到你的方法和类增加到 10 个以上时,你都不会有什么感觉。

直到产品说现在需求变了,让你把所有的备份库都改成 db3,那么,你就要把手头的工作都停下来,然后将代码中的备份库全改成 db3。

而且,如果你使用的是静态语言,那么,你就要把代码再重新编译一遍。关于静态语言的编译时长:为什么c编译需要这么长时间

那么就有了下面这种:

class ArchiveNew {
private $originDb;
private $backDb; public function doArchive() {
$dataDB = new $this->originDb(); $data = $dataDB->query("select * from t1"); $backDB = new $this->backDb(); foreach ($data as $key => $value) {
$backDB->query("insert into t2 values ". implode(',', $value));
} die("备份完成");
} /**
* @param mixed $originDb
*/
public function setOriginDb($originDb)
{
$this->originDb = $originDb;
} /**
* @param mixed $backDb
*/
public function setBackDb($backDb)
{
$this->backDb = $backDb;
}
}

这个方法,把所有的需要用到的数据库都放到了外面来进行管理,那么我们称这几个数据库为依赖,称在外部设置数据库的行为为依赖注入。

这只是一种很原始的使用方式,你可以继续延伸,将外部依赖放到统一的地方去管理,那么就有了注入容器(di Container)

2.2 服务定位器

服务定位器像是一个注册中心,向服务定位器中注册一个 a 服务,可以使用 a 这个名字从服务定位器中取出这个服务。

$locator = new ServiceLocator;
$locator->set('a');
$locator->get('a');

服务定位器是基于依赖注入的,在获取服务时,其实会在容器中先注册一个服务。

3. 请求与响应

这一节其实主要讲的就是请求。

请求的内容会比较多,还涉及到网络协议等知识,这里不再展开。

列举一下重要的几点:

  1. 路由美化 (将原始的路由修改成比较美观的地址,见导图 请求部分)
  2. url 解析(将美化过的路由解析成原始请求)
  3. 请求管理 (包括请求头部,请求体,解析器等等)

4. 数据库

虽然这张图有些搞笑,但是无疑说明了 数据库(MySQL)对于 PHP 的重要性。

4.1 类型转换

框架为了兼容各种数据库,对数据类型做了多层封装,并且做了一系列的转换规则:

4.2 事务

框架支持事务嵌套,但是嵌套的事务必须成对出现(注意!!!)。

看到事务这一节的时候,正巧同事出了一个 bug ,在脚本的循环中,出错之后没有 commit 或者 rollback ,导致,接下来的生成的事务都成了这个事务的子事务。而框架的嵌套事务,实际上是使用代码模拟的,如果父事务没有提交,那么子事务永远不会提交。

4.3 事件

const EVENT_INIT = 'init';                      // 初始化对象时触发
const EVENT_AFTER_FIND = 'afterFind'; // 执行查询结束时触发
const EVENT_BEFORE_INSERT = 'beforeInsert'; // 插入结束时触发
const EVENT_AFTER_INSERT = 'afterInsert'; // 插入之前触发
const EVENT_BEFORE_UPDATE = 'beforeUpdate'; // 更新记录前触发
const EVENT_AFTER_UPDATE = 'afterUpdate'; // 更新记录后触发
const EVENT_BEFORE_DELETE = 'beforeDelete'; // 删除记录前触发
const EVENT_AFTER_DELETE = 'afterDelete'; // 删除记录后触发

这些事件和其他事件没有什么分别,都是在特定的时候会执行,就不一一阐述了。

4.4 乐观锁和悲观锁

框架自带了乐观锁的实现,如果有类似需求,可以在重载 yii\db\ActiveRecord::optimisticLock() 方法,返回数据库中的版本号字段即可。在更新与删除时,框架会做相应的操作,来保证,更新的数据是自己拿到的数据,而不是被别人给修改过了。

因为悲观锁不适用于 web 应用,所以框架并没有实现悲观锁。

5. 总结

Yii2 框架的整体架构要比 Yii1 版本提升了一个逼格。并且得益于 namespace 特性,框架的目录结构清晰了很多。

对于不想了解框架底层实现的程序员,可以仅仅了解基本使用,就可以上手写业务代码,而不会影响你的开发效率。

只有当你遇见一个很蛋疼的框架内部报错或者 bug 的时候,你才会想到,我去,这怎么这么蛋疼,怎么框架还会有 bug ,但是很多时候是环境、配置或者特定的代码导致的。如果不了解框架的内部逻辑,这个报错或者 bug 会耽误你很长时间。

Yii2 框架整体结构的更多相关文章

  1. Yii2框架实现计数器功能

    思路: 因为yii2框架没有像tp框架那样的setinc这样的累加函数,所以只能在每次累加之前查出当前的这个字段的值,然后写算法累加入库 例如:

  2. 关于yii2框架活动记录activeRecord添加默认字段的问题

    平时使用sql的时候可以如下添加默认字段flag: "select a.*,0 as flag from user_info a", 对于yii2框架则需要这样: $query = ...

  3. Yii2框架RESTful API教程(二) - 格式化响应,授权认证和速率限制

    之前写过一篇Yii2框架RESTful API教程(一) - 快速入门,今天接着来探究一下Yii2 RESTful的格式化响应,授权认证和速率限制三个部分 一.目录结构 先列出需要改动的文件.目录如下 ...

  4. Yii2框架RESTful API教程(一) - 快速入门

    前不久做一个项目,是用Yii2框架写一套RESTful风格的API,就去查了下<Yii 2.0 权威指南 >,发现上面写得比较简略.所以就在这里写一篇教程贴,希望帮助刚接触Yii2框架RE ...

  5. [PHP]Yii2框架的坑

    [PHP]Yii2框架的坑.md-/Users/zjh/Documents/我的文章/[PHP]Yii2框架的坑 html{font-family: sans-serif;-ms-text-size- ...

  6. Yii2框架与MongoDB拓展、Redis拓展的安装流程

    @author 周煦辰 2016-03-21 这段时间新上了一个项目,使用的是Yii2框架.这里记录一下Yii2框架.Yii2-Mongo拓展.Yii2-Redis拓展等的安装流程.因为使用的系统是W ...

  7. yii2框架安装

    注意:先把php.ini里面的php_openssl.dll扩展打开 1.下载yii2框架的文件包yii-advanced-app-2.0.7 2.打开路径为advanced下面的init.bat   ...

  8. nginx完美支持yii2框架

    nginx完美支持yii2框架 server {listen 80;server_name www.peita.net peita.net;# default_server;access_log /d ...

  9. YII2框架动态创建表模型

    YII2框架动态创建表模型 在YII2中,每个表对应一个model类 在开发过程中,我们在填写一个大型表单的时候,表单里有N个select下拉列表,每个下拉select来自于不同的表: 如果要在程序里 ...

随机推荐

  1. T1110-计算线段长度

    原题链接: https://nanti.jisuanke.com/t/T1010 题目简述: 已知线段的两个端点的坐标A(Xa,Ya),B(Xb,Yb)A(X_a,Y_a),B(X_b,Y_b)A(X ...

  2. CentOS 7 ETCD集群配置大全

    目录 前言 环境准备 安装 静态集群 配置 node01 配置文件 node02 配置文件 node03 配置文件 启动测试 查看集群状态 生成TLS证书 etcd证书创建 安装cfssl工具集 生成 ...

  3. flask-简介

    什么是flask? Flask简介: Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务,在介绍Flask之前首先来聊下它和Django的联系 ...

  4. 文件上传之靶场upload-labs (1-10)

    第一关 sj 绕过 源码如下: lasIndexOf是返回函数最后一次出现的地方(从右到左) substring是用来截取函数的 indexOf是返回 表示从.出现的地方开始截取并判断是否在允许的字符 ...

  5. Python 中如何实现参数化测试?

    Python 中如何实现参数化测试? 之前,我曾转过一个单元测试框架系列的文章,里面介绍了 unittest.nose/nose2 与 pytest 这三个最受人欢迎的 Python 测试框架. 本文 ...

  6. NetCore 3.0 中使用Swagger生成Api说明文档及升级报错原因

    认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参 ...

  7. Golang中的布隆过滤器

    目录 1. 布隆过滤器的概念 2. 布隆过滤器应用场景 3. 布隆过滤器工作原理 4. 布隆过滤器的优缺点 5. 布隆过滤器注意事项 6. Go实现布隆过滤器 1. 布隆过滤器的概念 布隆过滤器(Bl ...

  8. git 使用详解(9)-- 分支的新建与合并 git branch -d、merge、 --merged/--no-merged/-v

    现在让我们来看一个简单的分支与合并的例子,实际工作中大体也会用到这样的工作流程: 开发某个网站. 为实现某个新的需求,创建一个分支. 在这个分支上开展工作. 假设此时,你突然接到一个电话说有个很严重的 ...

  9. openlayers5-webpack 入门开发系列结合 echarts4 实现散点图(附源码下载)

    前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...

  10. Codeforce612C

    You are given string s consists of opening and closing brackets of four kinds <>,{}, [], (). T ...