背景: 基于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的业务逻辑应该放哪里?相关推荐

  1. 表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)

    三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高内聚,低耦 ...

  2. android ui层 交互层 业务逻辑层 服务层,表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)...

    三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高内聚,低耦 ...

  3. 业务逻辑全写在sql_12306的业务逻辑很复杂么?一条SQL语句搞不定?

    春运又开始了,在贫困的那些年代来讲就是年关将至.年关,是年也是关,随着时代的进步,社会的发展,人民收入不断提高,年味淡了,关也少了.年关是什么?期末考试,催婚?不过对更多背井离乡的人来说可能最大的关就 ...

  4. 三层架构 业务逻辑层 workflow

    三层架构: 用户界面层 user interface layer 业务逻辑层 business logic layer 数据访问层 data access layer 系统的主要功能和业务逻辑都在业务 ...

  5. 三层架构:表示层-业务逻辑层-数据访问层

    三层架构和MVC是两个东西. 非要相关的话: 三层架构中"表现层"的aspx页面对应MVC中的View(继承的类不一样) 三层架构中"表现层"的aspx.cs页 ...

  6. 三层架构:表示层-业务逻辑-数据层

    三层架构:表示层-业务逻辑- 原文地址:三层架构:表示层-业务逻辑层-数据访问层  作者:灰烬 三层架构和MVC是两个东西. 非要相关的话: 三层架构中"表现层"的aspx页面对应 ...

  7. java逻辑层的作用_java三层架构原理与作用小结

    三层架构 三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高 ...

  8. java中表示层 控制层 业务逻辑层 数据访问层

    控制层(controller):的职能是负责读取视图表现层的数据,控制用户的输入,并调用业务层的方法: 业务层(service):需要根据系统的实际业务需求进行逻辑代码的编写,有些业务逻辑需要通过与数 ...

  9. 三层架构:表示层-业务逻辑层-数据访问层2

    概述 在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构.微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层.业务逻辑层(又或称为领域层).表示层. 三层结构原理: 3个层次中, ...

最新文章

  1. android手机装windows,安卓手机上运行WindowsXP系统图文教程
  2. Nginx + FastCgi + Spawn-fcgi + c 的架构
  3. Style Intelligence 10特点之用户自定义报表
  4. css盒子子类继承父类哪些,css不继承父类的属性有哪些
  5. Github 1.3万星,迅猛发展的JAX对比TensorFlow、PyTorch
  6. arcgis栅格邻域统计_地理工具学习--arcgis篇:单工具学习(14)
  7. ROST情感分析的语法规则_从词法分析角度聊 Go 代码组成
  8. Python编程 | 随机生成车牌号
  9. Linux操作系统原理— 进程与线程管理
  10. 联网下 计算机重启,电脑每次开机都要重启路由器才能上网的处理方法
  11. 20大风控文本分类算法-基于字符级的tfidf+逻辑回归
  12. Codeforces 407C--Curious Array
  13. linux环境,tomcat 关闭命令sh shutdown.sh 命令执行后进程没有关闭
  14. 2021年茶艺师(初级)考试资料及茶艺师(初级)考试技巧
  15. 使用OpenCV对物体搜索检测与识别
  16. word,Excel等office中鼠标不停闪动的解决方法
  17. 吃鸡神器!新款苹果 iPad,免费送一台!
  18. JTAG的TAP状态机介绍
  19. Error Code: 1265. Data truncated for column
  20. Spring MVC上传图片,Java二…

热门文章

  1. 实用的编程网站—良好的开端
  2. 十一、Python第十一课——用户输入和另一种循环(While)
  3. (十一)linux之poll轮询
  4. centos7ubuntu搭建Vulhub靶场(推荐Ubuntu)
  5. c语言里字符串和字符串字面量,string literals(字符串字面量)
  6. git merge 回退_Git 基础学习总结2(学不会你锤我)
  7. 四因素三水平正交表_做论文要用正交表?我打包送给你
  8. vcenter服务器修改ip,vcenter服务器默认ip地址
  9. ubuntu创建php文件,ubuntu系统创建桌面快捷方式的方法
  10. ①你真的学会Java了吗?来自《卷Ⅰ》的灵魂提问