热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

探讨phpyaf框架扩展实践四——业务层

和常见的mvc框架不同,这里多了一个业务层用来封装系统业务。为什么要多一个层出来呢?以往的时候没有这个层

和常见的mvc框架不同,这里多了一个业务层用来封装系统业务。为什么要多一个层出来呢?以往的时候没有这个层,通常都把业务放在控制器层进行处理。在长期的开发app的数据接口中,发现控制器层做的事情实在是太多了,既要处理表单的验证、还要检测接口版本、还要处理业务。如果业务简单些还好,要是业务比较复杂,这个代码是惨不忍睹啊,维护起来也非常痛苦。

于是呢就考虑将业务层的的代码封装出来独立处理,这样就有了业务层。业务层的代码存放目录:application/models/Business/,有一个抽象类abstract.php,其中也没有什么代码就一个禁止clone的方法。这里更多的是分享一下关于业务层代码封装的思想。主要是包含以下三个:

  • 目录规划
  • 业务错误流程处理
  • 错误码统一管理
yaf扩展业务层

yaf扩展业务层

目录规划

目录规划如果没有规划好,随着业务的增加,还要考虑适应旧版APP,目录就会越来越复杂。在长期的开发过程总结出了一些规律,建议目录以如下方式进行组织 :

Business/功能模块/具体业务+版本号.php

其中功能模块就是指大的一个业务模块;具体业务就是指其中的一个业务操作;版本号就是对应业务操作的版本。如果用户登录业务就可以是这样:

一开始版本用: Business/User/Login.php
 V2版本: Business/User/LoginV2.php
 V3版本: Business/User/LoginV3.php
 ...

在项目前期因为对产品不熟悉,修改业务是常有的事情,为了兼容旧的app版本,就会考虑增加一个业务版本。这样就会导致一个业务操作版本越来越多,对维护会造成困难。这里建议对旧的业务版本进行清理,随着用户逐渐更新到新版app,旧版本的使用用户已经没有的时候就可以删除旧的业务版本了。

业务错误流程处理

首先先定义一下什么是业务错误:就是一个业务操作如果最终没有达成,中间一些条件判断没有通过返回的错误,和程序上的错误是不同的。例如在登录操作中,需要校验用户是否存在,用户如果存在还需要校验账号密码是否匹配。中间只有有一个校验没有通过就可以认为该业务发操作生了错误。

对于这样的业务错误流程怎么样处理比较好呢?

早先的时候想着直接返回错误信息:

if(!true){
    return"错误信息";
}
但是在开发api接口的时候经常需要给到一个错误的编码,方便客户端针对不同的错误进行处理。于是就改进成这样:

if(!true){
    returnarray("errno"=> "10010", "errmsg"=> "错误信息");
}

不幸的是这样还是碰到了问题,有时候业务特别复杂的时候,通常会将其拆分成多个函数进行处理。每个函数都可能会有一些校验,每个校验如果都这样返回信息,那调用这些函数的主业务函数内不就要判断每个函数的返回结果,岂不是太麻烦了。

后来就想到使用异常的方式来中断流程,如:

if(!true){
    thrownew\Exception("错误信息",  "10010");
}

这样当发生业务错误的时候就会直接中断,并且返回了错误信息和错误编码,在控制器层调用业务方法的时候捕获异常就可以了,这种方法在代码深层嵌套的时候特别有用,能有效减少编码量提高代码的可读性。

当然在每个操作action方法中捕获异常看起来还不是很简洁,庆幸的是yaf提供了异常捕获的控制器,在controllers目录下新建Error控制器并且实现errorAction方法,则应用内没有捕获的异常都会抛到这里,在这里就可以对应用内抛出的异常进行相应的处理。

if($exception->getCode() > 100000) {
    //这里可以捕获到应用内抛出的异常
    echo$exception->getCode();
    echo$exception->getMessage();
    return;
}

错误码统一管理

上面解决了业务错误流程的处理,再把错误码统一进行管理就比较完美了,请参考项目下的application/models/Error目录,其中有一个Error类专门用来抛出异常;CodeConfig用来管理所有的错误码。代码上都比较易读就不多做说明了。

业务层的说明到这里就告一段落了,下面一篇将说明一下数据层的的封装,这个也是其中最重要的一篇了。很多项目到后面瓶颈都会在数据上,处理好了数据层项目就可以算是成功一半了。


推荐阅读
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • MVC设计模式的介绍和演化过程
    本文介绍了MVC设计模式的基本概念和原理,以及在实际项目中的演化过程。通过分离视图、模型和控制器,实现了代码的解耦和重用,提高了项目的可维护性和可扩展性。详细讲解了分离视图、分离模型和分离控制器的具体步骤和规则,以及它们在项目中的应用。同时,还介绍了基础模型的封装和控制器的命名规则。该文章适合对MVC设计模式感兴趣的读者阅读和学习。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 关羽败走麦城时路过马超封地 马超为何没有出手救人
    对当年关羽败走麦城,恰好路过马超的封地,为啥马超不救他?很感兴趣的小伙伴们,趣历史小编带来详细的文章供大家参考。说到英雄好汉,便要提到一本名著了,没错,那就是《三国演义》。书中虽 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 橱窗设计的表现手法及其应用
    本文介绍了橱窗设计的表现手法,包括直接展示、寓意与联想、夸张与幽默等。通过对商品的折、拉、叠、挂、堆等陈列技巧,橱窗设计能够充分展现商品的形态、质地、色彩、样式等特性。同时,寓意与联想可以通过象形形式或抽象几何道具来唤起消费者的联想与共鸣,创造出强烈的时代气息和视觉空间。合理的夸张和贴切的幽默能够明显夸大商品的美的因素,给人以新颖奇特的心理感受,引起人们的笑声和思考。通过这些表现手法,橱窗设计能够有效地传达商品的个性内涵,吸引消费者的注意力。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
author-avatar
重庆垚东科技有限公司
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有