0

0

业务逻辑层之事务脚本与领域模型

php中文网

php中文网

发布时间:2016-07-29 09:15:12

|

1584人浏览过

|

来源于php中文网

原创

在前面的博客中,已了解了前端控制器,页面控制器,应用控制器这三种表现层模式,如果说它们精心安排了外部世界与系统内部的通信,那么业务逻辑层的工作则是处理应用程序的业务部分。业务逻辑层应当远离那些外部的“噪音”。业务逻辑是整个应用程序的根本目的所在,系统的其它部分都是为这部分服务的。

这里介绍两种经常使用的领域逻辑模式:事务脚本模式和领域模型模式。

一、事务脚本

1.1 概念

Transaction Script:使用过程来组织业务逻辑,每个过程处理来自表现层的单个请求。貌似有点太抽象了。大多数业务应用都可以被看作是一系列事务,有时候,事务可能就显示下数据库的信息,有时候,也可能涉及许多校验和计算的步骤。事务脚本则将所有这些逻辑组织成单个过程,而且每个事务都有自己的事务脚本,就是都有自己的执行过程,但注意的是事务间的公共子任务可以被分解成多个子程序。

1.2 为什么要使用事务脚本

事务脚本模式的好处在于你可以很快就得到想要的结果。每个脚本都能很好地处理输入的数据并操作数据库来保证得到想要的结果。因此它是一个快速而有效的机制,且不需要投入大量时间和精力在复杂的设计上,对于小型且工期较紧的项目再适合不过。

1.3 实现事务脚本

具我工作经验观察,许多程序员都浑然不知地在使用这种模式,包括本人以前。

现在假设有发表博客和删除博客的业务,那将这两个业务分别看成两个事务脚本。

Php代码  业务逻辑层之事务脚本与领域模型

  1. //这里创建一个基类,作数据处理,假设用的是pdo  
  2. abstract class Base {  
  3.     function __construct() {  
  4.         //这里用了到之前博客讲的注册表  
  5.         $dsn = \woo\base\ApplicationRegistry::getDSN( );  
  6.         if ( is_null$dsn ) ) {  
  7.             throw new \woo\base\AppException"No DSN" );  
  8.         }  
  9.   
  10.         self::$DB = new \PDO( $dsn );  
  11.         self::$DB->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_Exception);  
  12.     }   
  13.   
  14.     protected function doStatement() {  
  15.         //执行sql  
  16.     }  
  17. }  
  18.   
  19. class blogManager extends Base {  
  20.     static $add_blog =  "INSERT INTO blog ( name ) values( ? )";  
  21.     static $del_blog = "DELETE FROM blog WHERE (?)";   
  22.   
  23.     //添加博客事务脚本  
  24.     function addBlog(...) {  
  25.         //处理参数,拼写add_blog格式的sql,调用父类doStatement执行,通知好友,一系列的子程序。。。  
  26.     }  
  27.       
  28.     //删除博客事务脚本  
  29.     function delBlog(...) {  
  30.         //处理参数,拼写del_blog格式的sql,调用父类doStatement执行。  
  31.     }   
  32. }  
  33. ?>  

 这个例子十分简单,但正因为它的简单,才正好体现了事务脚本的优势之处。如果写一个较为复杂应用程序,这种方式使项目不太容易扩展,因为事务脚本总是不可避免地互相渗入,从而导致代码重复。

二、领域模型

LongShot
LongShot

LongShot 是一款 AI 写作助手,可帮助您生成针对搜索引擎优化的内容博客。

下载

2.1 概念

Domain Model:很难用语言说清楚。简单的说就是领域模型象征着真实世界里项目中的各个参与者。“万物皆对象”的原则在此体现得淋漓尽致。在其他地方对象总是带着种种具体的责任,而在领域模式中,它们常常描述为一组属性及附加的代理。它们是做某些事的某些东西。

2.2 为什么要使用领域模型

现实代码中,会有很多事务脚本模式的身影,会发现重复代码是个普遍问题。当不同的事务要执行相同的任务时,重复貌似是最快的解决办法,但这大大增加了代码维护的成本。有时也可以通过重构来解决,但慢慢地复制粘贴可能成了开发中难以避免的一部分。

2.3 实现领域模型

为实现对比,引用事务模型的例子,并将领域模型类直接映射到关系数据库的表(这样做会使得开发变得简单)

Php代码  业务逻辑层之事务脚本与领域模型

  1. //这里创建一个基类,作数据处理,假设用的是pdo  
  2. abstract class Base {  
  3.     function __construct() {  
  4.         //这里用了到之前博客讲的注册表  
  5.         $dsn = \woo\base\ApplicationRegistry::getDSN( );  
  6.         if ( is_null$dsn ) ) {  
  7.             throw new \woo\base\AppException"No DSN" );  
  8.         }  
  9.   
  10.         self::$DB = new \PDO( $dsn );  
  11.         self::$DB->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_Exception);  
  12.     }   
  13.   
  14.     protected function doStatement() {  
  15.         //执行sql  
  16.     }  
  17. }  
  18.   
  19. class blogModel extends Base{  
  20.     function addBlog(...){}  
  21. }  
  22.   
  23. //创建一个领域模型的基类  
  24. abstract class DomainObject {  
  25.     private $id;  
  26.     //$id为表数据的主键id  
  27.     function __construct( $id=null ) {  
  28.         $this->id = $id;  
  29.     }  
  30.   
  31.     function getId( ) {  
  32.         return $this->id;  
  33.     }  
  34.   
  35.     //牢记 万物皆对象  
  36.     static function getCollection( $type ) {  
  37.         //获取要操作的对象      
  38.     }  
  39. }  
  40. class Blog extends DomainObject {  
  41.     private $name;  
  42.     private $feed;  
  43.   
  44.     function __construct( $id=null, $name=null ) {  
  45.         $this->name = $name;  
  46.         $this->feed = self::getCollection("\\woo\\domain\\Feed");  
  47.         parent::__construct( $id );  
  48.     }  
  49.   
  50.     function addBlog(...){  
  51.         //调用blogModel的方法添加  
  52.         //再调用feed发送通知给好友  
  53.     }  
  54.   
  55.     function setFeed( FeedCollection $Feed ) {  
  56.         $this->feed = $Feed;  
  57.     }  
  58. }  
  59. ?>  

2.4 小结

领域模型设计得简单还是复杂取决于业务逻辑的复杂度。使用领域模型的好处是:当你设计模型时可以专注于系统要解决的问题,而其他的问题(如持久化和表现等)可以由其他层来解决。

在实现项目中,大多数程序员在设计领域模型时还是把一半的注意力都放在数据库上。将领域模型和数据层分离会导致一定的代价,你也可能会将数据库代码直接放入模型中(尽管你可能会使用一个数据入口来处理实际的SQL)。对于相对简单的模型,特别当类与数据表一一对应时,这样方法是完全可行的,可以减少因协调对象和数据库而创建外部系统导致的时候消耗。

以上就介绍了业务逻辑层之事务脚本与领域模型,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

43

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

35

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

204

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
前端系列快速入门课程
前端系列快速入门课程

共4课时 | 0.4万人学习

Excel 教程
Excel 教程

共162课时 | 10.3万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号