从Laravel,Yii,Thinkphp中学习php 操作数据库的事务嵌套

02 Sep 2018 Category: PHP

最近维护历史代码,使用的是phalapi 最初版本开发,数据库操作使用的是notorm。notorm本身不支持事务嵌套,但是在开发过程中,多个操作进行拆分,根据不同业务不同进行调用,必然会设计到多个事务嵌套在一起的问题。举个栗子:

1) 公共模块A,更新用户的账户余额,添加流水记录操作。 2) 模块B,根据用户的操作(消费或充值)根据活动配置赠送相应的优惠券。 基础业务A模块就够用了,但是出现一些业务活动的时候,需要在A成功之后调用B模块,只有两个操作成功之后才完整提交事务。要实现这样的功能,无非两种方式:

1) 模块内部不加事务,事务控制统一交给调用方。谁调用,谁负责事务。内部模块只提供内部模块执行结果。 2) 模块内部控制事务,外部调用只需知道内部执行是否成功。

如果设计的合理,还是比较倾向于使用第一种方案。但是不可否认,你无法确定你的调用模块会不会再被其他人调用,最终结果又演变成第二种方案。因此底层还是需要支持事务嵌套。

查看更多

Laravel5.6 文件上传以及文件管理后台

20 Aug 2018 Category: PHP

今天聊聊在Laravel5.6 如何实现文件上传功能,以及上传文件的管理功能。主要有文件列表,上传新文件,创建文件夹,删除文件夹以及删除文件。

首先添加一个控制器,在命令行中输入php php artisan make:controller Admin/FileController,创建一个空的FileController控制器,控制器中有下列四个方法:

  • index 显示文件和目录列表
  • upload 上传新文件
  • createFolder 创建新文件夹
  • delete 删除文件或目录

查看更多

Laravel5.6 博客搭建系列四--文章标签后台管理

09 Aug 2018 Category: PHP

创建标签模型和迁移

首先需要创建 Tag 模型类:php artisan make:model --migration Tag该命令会在 app 目录下创建模型文件 Tag.php,由于我们在 make:model 命令中使用了 –migration 选项,所以同时会创建 Tag 模型对应的数据表迁移。在标签(Tag)和文章(Post)之间存在多对多的关联关系,因此还要按照下面的命令创建存放文章和标签对应关系的数据表迁移:php artisan make:migration --create=post_tag_pivot create_post_tag_pivot

查看更多

读Yii2框架的web返回格式化类Response

06 Aug 2018 Category: PHP

一个完整的网络请求,最后都需要一个符合协议的返回。Yii2在处理web请求之后,统一通过web/Response处理返回。错误也会经过错误处理返回一个Response。

一个Response完整的流程有哪些?

  • 创建Response对象,设置Resonse响应格式json,html,xml等
  • 触发前置事件,暴露操给开发者在输出前对数据进行调整等
  • 数据格式化。将所有response的内容更加输出格式转换成响应的字符串,并确定http返回码。
  • 设置响应头。输出所有自定会返回头和标注http协议返回头。
  • 输出内容。将字符串内容输出,并刷新缓冲区
  • 触发后置事件。触发Response后置操作
  • 数据清理

查看更多

聊聊Yii2和ThinkPHP5的文件缓存

03 Aug 2018 Category: PHP

翻一翻Yii2和ThinkPHP5的源码,看看它们的文件缓存。看看这些使用广泛的框架如何设计一个缓存操作类。

Yii2和ThinkPHP5缓存操作提供的公共方法对比

Yii2缓存提供的方法
  • get 获取对应$key缓存,不存在或过期返回false
  • set 设置缓存数据
  • exists 判断缓存是否存在
  • mset multiSet 方法别名,用于批量设置缓存
  • mget multiGet 方法别名,用于批量获取缓存
  • add 添加缓存 返回true,如果缓存已经存在则不做操作返回false
  • madd 批量添加多个,返回成功插入的缓存键名数组
  • delete 删除缓存
  • flush 清空缓存所有数据
  • offsetExists exists别名
  • offsetGet get别名
  • offsetSet set别名
  • offsetUnset delete别名
  • getOrSet 获取缓存,如果不存在则根据传入的回调函数设置缓存

查看更多

从YII2 和ThinkPHP5 中看PHP如何获取所有请求头

02 Aug 2018 Category: PHP

开发当中,很多信息除了通过参数传递之外,还会有一些数据通过请求头来传递。分析Yii2和ThinkPHP5 框架代码,看如何用PHP语言获取请求头。

Yii2 获取所有请求头

    public function getHeaders()
    {
        $headers = [];
        if (function_exists('getallheaders')) {
            $headers = getallheaders();
            
        } elseif (function_exists('http_get_request_headers')) {
            $headers = http_get_request_headers();
            
        } else {
            foreach ($_SERVER as $name => $value) {
                if (strncmp($name, 'HTTP_', 5) === 0) {
                    $name = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))));
                    $headers[$name] = $value;
                }
            }
        }
        return $headers;
    }

查看更多

LetCode 查找数组中两个数之和等于特定数值

20 Jul 2018 Category: PHP

假设允许赠送礼物配置

{"apple":5,"Banana":3,"Fig":7,"Grape":1,"Haw":4,"Mango":6,"Nectarin":8,"Pear":2,"Pitaya":6,"empty":0}

业务需求要求当用户充值>50 且<80 赠送价值4元礼物,当用户充值>80 且小于<100 赠送6元礼物,当用户充值>100 赠送价值10礼物,单次赠送不赠送相同礼物。对于这样的问题,如果在工作中如何解决?我们先来看一看Letcode中的一道题 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

查看更多

创建自己的 Thinkcmf 后台模板

18 Jul 2018 Category: PHP

由于工作原因,项目的后台都是采用Thinkcmf搭建。但是看了那么久的默认样式,还是觉得有点不喜欢。因此想自己套一套主题上去,弄个漂亮点的界面效果。 经过两天的努力,终于在material-dashboard html后台模板的基础,结合thinkcmf官方bootstrap3 的模板修改出一套material模板。

修改过程比较麻烦的事

  • thinkcmf的所有模板都是以引入的方式,引入header,而没有使用thinkphp的模板继承。这种方式,当需要在全部页面添加一个公共的动东西,比如一个隐藏控件,操作起来比较麻烦,需要修改所有的文件。

  • iframe左侧菜单的输出需要根据模板进行修改,html结构改动比较大。

  • 继承的继承模板创建好之后,需要一个个的去修改原有页面的代码,添加模板继承,将不需要改动的地方放入content block 中

查看更多