热门标签 | 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用来管理所有的错误码。代码上都比较易读就不多做说明了。

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


推荐阅读
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 深入理解父组件与子组件的引用和访问
    本文详细介绍了如何在Vue.js中通过$children和$refs属性实现父组件对子组件的访问,并提供了具体的代码示例及最佳实践。 ... [详细]
  • 如何在Faceu激萌中设置和使用妆容切换特效?
    本文将详细介绍如何在Faceu激萌应用中设置和使用妆容切换特效,帮助用户轻松实现创意拍摄。无论是新手还是有经验的用户,都能从中受益。 ... [详细]
  • 本文介绍了拍摄高质量Vlog所需的设备,包括索尼A7 III相机、蔡司镜头、罗德麦克风、单反稳定器、苹果手机及其配件、灯光设备等。此外,还探讨了后期制作所需的软件工具,如剪辑、特效和调色软件。无论你是业余爱好者还是专业创作者,选择合适的设备至关重要。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文详细介绍了暂估入库的会计分录处理方法,包括账务处理的具体步骤和注意事项。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 极大似然估计(MLE)及其3D可视化解析
    本文详细介绍了极大似然估计(Maximum Likelihood Estimation, MLE)的推导过程,并通过3D可视化展示其在概率密度函数中的应用。我们将探讨如何利用MLE来估计参数,以及它在实际问题中的重要性。 ... [详细]
  • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 探讨一个老旧 PHP MySQL 系统中,时间戳字段不定期出现异常值的问题及其可能原因。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 本文讨论了如何根据特定条件动态显示或隐藏文件上传控件中的默认文本(如“未选择文件”)。通过结合CSS和JavaScript,可以实现更灵活的用户界面。 ... [详细]
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社区 版权所有