php mvc 逻辑层在哪,mvc的业务逻辑应该放哪里?

背景: 基于laravel的后台管理系统,CURD密集型业务

问题:当直接在控制器方法中调用orm处理业务逻辑时,代码复用性差,控制器层很肥

尝试解决1:新建一个model层,将原先在控制器中的处理逻辑移到model中,包括数据校验

下面是model的基类class BaseModel implements Responsable,UniqueCheckable

{

// 业务模型应当都具备产生模型响应的能力

use ModelResponse;

// 当前业务CRUD操作密集,几乎都需要检验唯一性

use CheckUniqueness;

//业务模型以orm为驱动将数据进行持久化

protected static $orm = null;

// 一个业务模型能被一个id唯一标识

protected $primaryId;

public function __construct($primaryId){

$this->primaryId = $primaryId;

}

// 实现UniqueCheckable接口,子类必须重写该方法

public static function getPrimaryField(){

exit(static::class." doesn't implements getPrimaryField function");

}

}

其他模型类中的属性都是为了实现具体的方法服务的,下面是其中一个model的定义:class Tables extends BaseModel

{

private $tenantId;

private $branchId;

protected static $orm = 'App\DAL\Tenant\Tables';

/**

* @param int $tenantId [商户id]

* @param int $branchId [门店id]

*/

public function __construct($tenantId , $branchId){

$this->tenantId = $tenantId;

$this->branchId = $branchId;

}

/**

* [参数初始化]

* @param  array  $data [description]

* @return [type]       [description]

*/

public static function paramInit(array &$data){

$data['pricePerHour']= array_key_exists('pricePerHour',$data)?$data['pricePerHour']:0;

$data['minConsumption']= array_key_exists('minConsumption',$data)?$data['minConsumption']:0;

$data['number']= array_key_exists('number',$data)?$data['number']:0;

}

/**

* @param array $data [description]

*/

public function add(array $data){

// 请求参数初始化

static::paramInit($data);

// 业务规则校验

if(!static::isValueAllowed($this->branchId,'name',$data['name'])){

return static::response(false,'该桌台已经存在');

}

$table = static::$orm::create(['tenantId'=>$this->tenantId,

'branchId'=>$this->branchId,

'position'=>$data['position'],

'minConsumption'=>$data['minConsumption'],

'number'=>$data['number'],

'pricePerHour'=>$data['pricePerHour'],

'name'=>$data['name']

]);

return $table?static::response(true,$table):static::response(false,'数据写入失败');

}

}

该方法的问题:model层只是业务逻辑的封装?但有新的需求就往model中加新的方法,然后在控制器中调用,那么这个model类不就只是方法的堆积?

尝试解决2:initPHP框架中提出了dscv的架构,其实就是把业务逻辑放在service中,然后在控制器中调用service对象来完成请求的处理

这种方法正在考虑实施

尝试解决3: 在看到了这篇文章后:也许后端MVC的说法已经过时了,感觉作者正好说到了我的痛点,所以又打算把控制器层分割为控制器+service层,把model分割为使用orm的数据持久层和repository层。这几者之间的关系是repository调用orm进行数据持久化,service层通过repository实现相关操作,然后控制器层调用service处理请求。但是这时候对这个repository层感到疑惑,如果重新对orm实现的功能进行封装那么工作量将很大,而实际带来的好处也不是很显而易见的。所以我目前倾向于认为orm中对应的对象是数据库中的表,而repository对应的对象是领域驱动设计中谈到的entity或者aggregate,那么这个时候我是不是又该根据把m变为 领域层+repository+基础设施层?

这个问题已经纠结挺久了,谢谢各位大神的指教

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

servlet/filter/listener/interceptor区别与联系

下面从几个方面阐述一下题目中四个概念的区别与联系: 1、概念 2、生命周期 3、职责 4、执行过程 一、概念: 1、servlet:servlet是一种运行服务器端的Java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页…

电脑系统哪个最好用_袪痘袪痘印哪个产品最好 祛痘印最好用的产品十大推荐...

原标题:袪痘袪痘印哪个产品最好 祛痘印最好用的产品十大推荐痘痘下去了,痘印却顽固不化。有些痘印如果不及时修复,会留下疤痕和坑。我们真的不敢去想他们。所以有痘印痘印的时候一定要及时使用护肤品,不要在脸上留下什么遗憾&…

python中集合符号,Python 集合符号

Android SDK Manager 无法下载更新,或者更新速度超慢,或者待安装包列表不显示解决方法: 转自 http://www.cnblogs.com/tc310/archive/2012/12/21/2828450.html http://jingyan.baidu.com/artic ...AJAX学习AJAX即“Asynchronous Javascript And XML”(异…

五阿哥钢铁电商平台Docker容器云平台建设实践——你想知道的都在这里!

前言 五阿哥钢铁电商平台(www.wuage.com)是由钢铁行业第一的中国五矿与互联网第一的阿里巴巴联手打造,并充分运用双方股东优势资源,即:阿里巴巴在大数据、电商运营、互联网产品技术上的巨大优势,尤其是在B2…

oracle数据导入导出

一、exp/imp与expdp/impdp的区别 1:把用户usera的对象导到用户userb,用法区别在于fromuserusera touseruserb ,remap_schemausera:usera 。例如 imp system/passwd fromuserusera touseruserb file/oracle/exp.dmp log/oracle/exp.log; impdp system/passwd directo…

web浏览器_Web上的分享(Share)API

我认为Web Share API非常酷,简而言之,它会利用您所使用的平台上的原生共享功能(如果该平台支持的话)。我喜欢这个:在iOS上激活的Web Share API远远不止这些东西:为什么?Web Share API只是几行代码。简单!没…

Oracle视图添加约束,Oracle创建视图的语法

Oracle创建视图的语法导读:就爱阅读网友为大家分享了多篇关于 "oracle 创建序列语法" 资料,内容精辟独到,非常感谢网友的分享,希望从中能找到对您有所帮助的内容。相关资料一 : Oracle 创建视图的语法Oracle 创建视图的…

linux压缩和解压缩命令

tar命令解包:tar zxvf FileName.tar打包:tar czvf FileName.tar DirNamegz命令解压1:gunzip FileName.gz解压2:gzip -d FileName.gz压缩:gzip FileName.tar.gz 和 .tgz解压:tar zxvf FileName.tar.gz压缩&a…

【Java进阶】Java Lambda 表达式、Stream API完整梳理

一、Lambda表达式 Lambda 表达式是一种匿名函数,它可以用来定义函数式接口的实现。Lambda 表达式可以用来简化代码,提高代码的可读性和可维护性。 1、Lambda 表达式 1.1、语法介绍 Lambda 表达式的语法如下: (parameters) -> express…

使用T-SQL语句操作数据表-删除数据

1.使用 delete 语句删除表中的数据&#xff1a;语法&#xff1a;delete from <表名> [where <删除条件>]delete 是删除的意思 where是选填内容可以不加&#xff0c;但是不加条件的话是删除整个表 例子&#xff1a;delete from 成绩表 where 姓名张三含义&#xff1…

Oracle expdp/impdp导出导入命令及数据库备份

经常报错&#xff1a; ORA-39002: invalid operation ORA-39070: Unable to open the log file. ORA-29283: invalid file operation ORA-06512: at "SYS.UTL_FILE", line 536 ORA-29283: invalid file operation 解决方法&#xff1a; 1、 CREATE OR REPLACE DI…

exfat单元分配要设置多少_微软宣布,支持往Linux内核里添加exFAT存储了!跨系统存储的福音...

栗子 发自 凹非寺 量子位 报道 | 公众号 QbitAIexFAT&#xff0c;是微软开发的文件系统&#xff0c;为闪存而生。你的U盘、SD卡、手机等等存储设备&#xff0c;能存4G以上的大文件&#xff0c;很大程度上是它的功劳。可exFAT一直是专有的&#xff0c;微软手握多项专利。所以&am…

在linux中安装oracle中文包,在Linux命令行下安装Oracle 10g

Oracle 10g支持在命令行下用静默模式(Silent)安装&#xff0c;给那些没有安装图形界面的Linux系统提供了极大的便利。下面以Fedora Core 6为例&#xff0c;介绍在命令行下安装OracleOracle 10g的方法。1 安装前的准备准备工作要用登录为root用户来进行。1.1 选择安装环境的语言…

Jetbrains 系 IDE 编辑器的代码提示功能

著名的 Jetbrains 可谓编程界的一大福音&#xff0c;众多有名代码编辑器比如 ItelliJ IDEA、PHPStorm、WebStorm、PyCharm 等&#xff0c;均出自这家公司麾下。 对于中国的Java开发者来说&#xff0c;可能使用 Eclipse 的人最多。 使用Idea的程序员也不少, 而且每个人都在鼓吹其…

Oracle下的Databse,Instance,Schemas

1、DATABASE&#xff0c;对oracle而言&#xff0c;是指物理上的数据库&#xff0c;一般你安装了一个oracle的数据库软件后&#xff0c;就是一个database。 2、instance&#xff0c;在同一个数据库上&#xff0c;可以建立多个实例&#xff0c;这些实例互相不干扰&#xff0c;每个…

oracle实验数据库和表,1oracle创建数据库和表.doc

1oracle创建数据库和表.doc实验一&#xff1a;创建数据库和表一、实验目的1. 掌握使用DBCA创建数据库2. 掌握手工创建Oracle数据库的方法3. 掌握创建数据表的方法二、实验内容及步骤1. 使用DBCA创建数据库(1) 打开DBCA组件,创建数据库sale.(2) 安装完后进入D:\oracle\product\1…

tkmybatis 子查询_真假童子命符箓道长教你如何查询

童子命查询方法一&#xff1a;童子命在相术里&#xff0c;指的是一生都霉运连连如过本命年的人。古代关于真童子命查询有口诀“春秋甲寅子&#xff0c;冬夏卯未辰&#xff1b; 金木乙卯未&#xff0c;水火庚辛壬&#xff1b; 土命逢辰巳&#xff0c;童子定为真”解释上面的口诀…

使用 nvm 安装 nodejs 和 npm

使用 nvm 可以方便的进行 nodejs 的安装和版本管理。其实最开始使用的是 n 命令&#xff0c;命令简洁到极致了&#xff0c;无奈总是安装不成功&#xff0c;往往下载一部分就报 curl 错误。然后又找到这个 nvm&#xff0c;配合淘宝源&#xff0c;简单快捷&#xff5e; 1.到 nvm …

ECLIPSE配置OSGI服务器

eclipse版本如下&#xff1a; Eclipse Java EE IDE for Web Developers. Version: Mars Release (4.5.0) Build id: 20150621-1200 ------------------------ 1、进入eclipse-----run----run configuration---osgi framework---new 2、取消全选 3、在搜索框中输入 osgi&a…

oracle ebs r12财务月结基础讲座20090823,095921_OracleEBSR12财务月结基础讲座20090823课件.ppt...

095921_OracleEBSR12财务月结基础讲座20090823课件2009年8月23日方亚兵、巩学伟;1、月结概述 1.1)月结与对帐 1.2)子模块与总帐之间的关系 1.3)关帐顺序2、各模块详细结帐流程及对帐 2.1)应付 2.2)采购 2.3)库存 2.4)应收 2.5)资产 2.6)PAC 2.7)总帐3、应收模块业务规则介绍4、…