首页 > 作文

Yii2 框架整体结构

更新时间:2023-04-07 17:04:31 阅读: 评论:0

yii2框架是一个非常庞大但是并不臃肿的 php 框架。使用 yii2 框架,可以极大的提升开发效率,但是凡是有利有弊,我们在享有 yii2 框架带来的开发便利的同时,必须承担其带给我们的坑。
秉持着要知其然也要知其所以然的思想,花了一周的时间,看了 linuor 的 《深入理解yii2.0》
根据我的理解梳理了一下 yii2 框架的整体结构。此后简称框架。

yii 框架基础

此框架的三个基础概念:

属性事件行为

毕竟三生万物。

属性

一看到这个词可能很迷惑,那么什么是属性呢。
比如说,你现在正在玩一款角色扮演的游戏,角色双手分别有一把 十方大剑 ,一个 十方盾牌
那么从面向对象的角度而言,你的角色类需要有 左手武器右手武器 两个成员变量。
并且角色类可以从 左手武器右手武器 中获得 力量属性。

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

事件

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

行为

框架的行为也可以使用角色扮演游戏来举例,你在 无尽荒原 捡到了一本魔法书,学会了禁咒魔法,召唤神龙
于是你把程序一改,给你的类加一个召唤魔法的方法,这是不可能的。我们必须让你的类拥有一个动态添加方法的功能,于是所有拿到魔法书的人或者限定职业的人,都能学会这个禁咒这就是行为的作用,动态给类增加方法。

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

设计模式

依赖注入

框架采用了现在世面上面最常见的一种模式, mvc 模式,具体细节不在阐述,现在网上关于 mvc 的介绍可以说是烂大街了。
但是 mvc 只是一种大框架上的设计模式,其核心思想是分层,最终目的是解耦。框架在 mvc 的基础上,应用了很多经典的设计模式以及后来发展的设计模式。

其中最重要的就是:

依赖注入服务定位器。

那么什么是依赖注入呢
先来一段没有依赖注入的代码:

<?php// 这段代码将 db1 中的t1表的数据备份到 db2 库的 t2 中。// 所使用的变量都在逻辑过程中申请。class archive {  疫情下的 温情兰州 public function doarchive() {    $datadb = new db1();       $data = $datadb->query("lect * from t1");    $backdb = new db2();    foreach ($data as $key => $value) {      $backdb->query("inrt into t2 values ". implod校考时间e(',', $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("lect * from t1");        $backdb = new $this->backdb();        foreach ($data as $key => $value) {            $backdb->query("inrt into t2 values ". implode(',', $value));        }        die("备份完成");    }    /**     * @param mixed $origindb     */    public function torigindb($origindb)    {        $this->origindb = $origindb;    }    /**     * @param mixed $backdb     */    public function tbackdb($backdb)    {        $this->backdb = $backdb;    }}

这个方法,把所有的需要用到的数据库都放到了外面来进行管理,那么我们称这几个数据库为依赖,称在外部设置数据库的行为为依赖注入。
这只是一种很原始的使用方式,你可以继续延伸,将外部依赖放到统一的地方去管理,那么就有了注入容器(di container)

服务定位器

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

$locator = new rvicelocator;$locator->t('a');$locator->get('a');

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

请求与响应

这一节其实主要讲的就是请求。
请求的内容会比较多,还涉及到网络协议等知识,这里不再展开。
列举一下重要的几点:

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

数据库

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

类型转换

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

事务

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

事件

const event_init = 'init糖醋小排的做法';           // 初始化对象时触发const event_after_find = 'afterfind';      // 执行查询结束时触发const event_before_inrt = 'beforeinrt';   // 插入结束时触发const event_after_inrt = 'afterinrt';    // 插入之前触发const event_before_update = 'beforeupdate';   // 更新记录前触发const event_after_update = 'afterupdate';    // 更新记录后触发const event_before_delete = 'beforedelete';   // 删除记录前触发const event_after_delete = 'afterdelete';    // 删除记录后触发

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

乐观锁和悲观锁

框架自带了乐观锁的实现,党委书记述职报告如果有类似需求,可以在重载yii\db\activerecord::optimisticlock() 方法,返回数据库中的版本号字段即可。在更新与删除时,框架会做相应的操作,来保证,更新的数据是自己拿到的数据,而不是被别人给修改过了。
因为悲观锁不适用于 web 应用,所以框架并没有实现悲观锁。

总结

yii2 框架的整体架构要比 1 版本提升了一个逼格。并且得益于 namespace 特性,框架的结构清洗了很多。
对于不想了解框架底层实现的程序员,可以仅仅了解基本使用,就可以上手写业务代码,而不会影响你的开发效率。
只有当你遇见一个很蛋疼的框架内部报错或者 bug 的时候,你才会想到,我去,这怎么这么蛋疼,怎么框架还会有 bug ,但是很多时候是环境、配置或者特定的代码导致的。如果不了解框架的内部逻辑,这个报错或者 bug 会耽误你很长时间。

本文发布于:2023-04-07 17:04:30,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/95df59674649e816042b1a41a1b9b6c2.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Yii2 框架整体结构.doc

本文 PDF 下载地址:Yii2 框架整体结构.pdf

标签:框架   事务   代码   定位器
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图