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+基础设施层?
这个问题已经纠结挺久了,谢谢各位大神的指教
php mvc 逻辑层在哪,mvc的业务逻辑应该放哪里?相关推荐
- 表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)
三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高内聚,低耦 ...
- android ui层 交互层 业务逻辑层 服务层,表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)...
三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高内聚,低耦 ...
- 业务逻辑全写在sql_12306的业务逻辑很复杂么?一条SQL语句搞不定?
春运又开始了,在贫困的那些年代来讲就是年关将至.年关,是年也是关,随着时代的进步,社会的发展,人民收入不断提高,年味淡了,关也少了.年关是什么?期末考试,催婚?不过对更多背井离乡的人来说可能最大的关就 ...
- 三层架构 业务逻辑层 workflow
三层架构: 用户界面层 user interface layer 业务逻辑层 business logic layer 数据访问层 data access layer 系统的主要功能和业务逻辑都在业务 ...
- 三层架构:表示层-业务逻辑层-数据访问层
三层架构和MVC是两个东西. 非要相关的话: 三层架构中"表现层"的aspx页面对应MVC中的View(继承的类不一样) 三层架构中"表现层"的aspx.cs页 ...
- 三层架构:表示层-业务逻辑-数据层
三层架构:表示层-业务逻辑- 原文地址:三层架构:表示层-业务逻辑层-数据访问层 作者:灰烬 三层架构和MVC是两个东西. 非要相关的话: 三层架构中"表现层"的aspx页面对应 ...
- java逻辑层的作用_java三层架构原理与作用小结
三层架构 三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高 ...
- java中表示层 控制层 业务逻辑层 数据访问层
控制层(controller):的职能是负责读取视图表现层的数据,控制用户的输入,并调用业务层的方法: 业务层(service):需要根据系统的实际业务需求进行逻辑代码的编写,有些业务逻辑需要通过与数 ...
- 三层架构:表示层-业务逻辑层-数据访问层2
概述 在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构.微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层.业务逻辑层(又或称为领域层).表示层. 三层结构原理: 3个层次中, ...
最新文章
- android手机装windows,安卓手机上运行WindowsXP系统图文教程
- Nginx + FastCgi + Spawn-fcgi + c 的架构
- Style Intelligence 10特点之用户自定义报表
- css盒子子类继承父类哪些,css不继承父类的属性有哪些
- Github 1.3万星,迅猛发展的JAX对比TensorFlow、PyTorch
- arcgis栅格邻域统计_地理工具学习--arcgis篇:单工具学习(14)
- ROST情感分析的语法规则_从词法分析角度聊 Go 代码组成
- Python编程 | 随机生成车牌号
- Linux操作系统原理— 进程与线程管理
- 联网下 计算机重启,电脑每次开机都要重启路由器才能上网的处理方法
- 20大风控文本分类算法-基于字符级的tfidf+逻辑回归
- Codeforces 407C--Curious Array
- linux环境,tomcat 关闭命令sh shutdown.sh 命令执行后进程没有关闭
- 2021年茶艺师(初级)考试资料及茶艺师(初级)考试技巧
- 使用OpenCV对物体搜索检测与识别
- word,Excel等office中鼠标不停闪动的解决方法
- 吃鸡神器!新款苹果 iPad,免费送一台!
- JTAG的TAP状态机介绍
- Error Code: 1265. Data truncated for column
- Spring MVC上传图片,Java二…
热门文章
- 实用的编程网站—良好的开端
- 十一、Python第十一课——用户输入和另一种循环(While)
- (十一)linux之poll轮询
- centos7ubuntu搭建Vulhub靶场(推荐Ubuntu)
- c语言里字符串和字符串字面量,string literals(字符串字面量)
- git merge 回退_Git 基础学习总结2(学不会你锤我)
- 四因素三水平正交表_做论文要用正交表?我打包送给你
- vcenter服务器修改ip,vcenter服务器默认ip地址
- ubuntu创建php文件,ubuntu系统创建桌面快捷方式的方法
- ①你真的学会Java了吗?来自《卷Ⅰ》的灵魂提问