php model层怎么写逻辑,目前用php框架的话,大家会把逻辑写到model中吗?

目前用php框架的话,大家会把逻辑写到model中吗?

还是model只做数据的添加删除 修改操作?

如果说是简单 mvc框架 你们把逻辑写在哪里?controller?

还是说自己弄了个逻辑层?

回复内容:

目前用php框架的话,大家会把逻辑写到model中吗?

还是model只做数据的添加删除 修改操作?

如果说是简单 mvc框架 你们把逻辑写在哪里?controller?

还是说自己弄了个逻辑层?

我支持把业务逻辑封装到Model里,Controller(或称Action)里最好只进行数据转换、整理,确保在Model里尽量不要直接访问GET、POST、SESSION里的数据,一切需要的数据通过方法参数或实例化时传入Model,这样的话代码干净、方便测试,且在你需要编写服务器端的批量维护程序时,仍然可以调用Model来完成业务数据的获取和写入。

同时也赞同 @Airy 的做法。

我一般这么处理的:跟视图相关的逻辑写到 Controller,比如根据登录状态展示不同的页面.跟数据相关的逻辑写到 Model .

我目前是:

Model: 业务逻辑

Contrller: 界面逻辑+基本数据验证

但是发现业务逻辑写到Model里,造成Model非常臃肿, 而且与多种基础设施,第三方Api等等耦合,维护十分不便。

打算重构并独立出一层业务层,放置Model与Model、Model与其他组件的交互逻辑、以及异常处理等。让Model只负责数据验证和CRUD。

我是中间增加一个业务层,控制器只做输入输出,不做业务逻辑,把业务逻辑放在业务层处理,提高代码公用性,model与表一一对应,只做单表查询或者关联查询

这个涉及到面向对象设计的一个问题。Robert·C·Martin在面向对象设计的原则里面提出SOLID原则,具体内容可以参考维基百科的这个链接SOLID面向对象设计

那么,控制器的作用在于对视图和业务模块进行调度,所以根据单一功能原则,控制器不应该包含业务逻辑的处理功能,也就是说业务逻辑不应该放在控制器部分进行处理。

那业务逻辑是不是应该放在Model部分进行处理呢?我们在观察Model的这个概念的时候,会发现,这个概念是比较含糊的。因为业务逻辑的处理起码分为两个部分,第一个部分,数据存取;第二个部分,逻辑操作。根据我的理解,我个人认为,Model层的工作在于业务逻辑的实现,而不应该进行数据存取。

我们反过来想这个问题,如果把业务逻辑和数据存取耦合在一个类里面,会存在什么问题?那么,一个显而易见的问题就是,当我们的数据源在未来架构中发生变化和调整的时候,我们就必须修改Model类以适应这种变化,而这应该是违反开闭原则的,也违反单一功能原则。因此,合理的做法应该是,将数据存取单独的封装成另外一个类。

我们进行程序设计的时候,除了考虑基本的功能实现以外,还必须考虑代码的可维护性,程序的可扩展性这些问题,因此程序要做到“高内聚,低耦合”,理想的情况是,当需求和架构发生变化的时候,我们不应该修改既定代码,而增加新代码来反应系统面临的变化;不同模块之间,依靠接口编程进行互相调用,而封闭模块的内部实现。

因此,一般而言,控制器只单独处理视图和Model的调用,依靠接口进行数据传递工作,视图和Model的内部实现对于控制器应该是封闭的。在MVC的设计原则中,有一条获得比较多认可的原则就是Thin Controller Fat Model。在实践中,一些业务逻辑的处理结果可能通过常驻进程和定时任务进行处理,而控制器只需要跟静态缓存进行沟通,即可快速的做出响应。因此,业务逻辑处理是一个单独的系统。

当然,系统分层和解耦,会额外带来对象管理和设计上的复杂度和负担。MVC模式并不是适合一切情况的最佳模式,对于中小型系统,业务逻辑不复杂的情况下,其实使用Model1方式进行系统设计,即一个前端展示系统和一个后端数据操作系统即可。而对于需要长期可动态维护、进行服务扩展、灵活配置系统的软硬件资源的系统,则需要进行充分的封装解耦以隔离问题。

我这边基本和之前几位说的一致,唯一不同可能是:model层只写针对一张数据表的逻辑代码,而设计到多个表的复杂业务逻辑会写在额外的业务层。

我们的新员工,通常会将逻辑写在 Controller 中,Model基本没有任何内容。

所以,入职说明规定:将业务逻辑写在Model中的

因为:放在 Controller 中,会重复对某些业务逻辑编码。

比如:病人换床会出现在:新入院、老人换床、出院 多个 Controller 中,但是代码只应该写在 病人或者床这个Model中。

引用文字

涉及到多个表的复杂业务逻辑会写在额外的业务层。

这个我还是认为要写在Model中,因为涉及多个Model,所以只能选择某个合适的model写入代码,其他model调用。

不知道是不是有更好的设计方案。

相关标签:php

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

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

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

相关文章

gradle项目 构建_使用Gradle构建Monorepo项目

gradle项目 构建根据Wikipedia的说法 , monorepo是一种软件开发策略,其中许多项目存储在同一资源库中。 这种策略可以快速检测到因依赖关系的更改而导致的潜在问题和破坏,并且已被许多使用大型代码库的组织采用,例如Google&#x…

jsoup爬虫教程技巧_Jsoup V的幕后秘密:优化的技巧和窍门

jsoup爬虫教程技巧我们已经把事情做好了,现在是时候加快工作速度了。 我们会牢记Donald Knuth的警告:“大约97%的时间我们应该忘记效率低下:过早的优化是万恶之源”。 根据Jonathan Hedley的介绍,他使用YourKit Java …

DOM(document object model),文档对象模型

DOM 将标记语言文档一次性加载进内存中,在内存中形成一棵 DOM 数。

php 获取请求设备,php – 如何获取设备令牌

我有一个iOS应用程序,我想集成推送通知.我见过tutorial on youtube,一切都还可以,但最近我使用的是开发证书(用于测试 – 不用于AppStore),我的服务器上有PHP脚本.在这个文件中存储了deviceToken,它有我的iPhone并且用php变量$deviceToken编写.但是现在,当我想在AppStore中使用…

java项目使用junit_在Java 8之前的项目中使用JUnit 5

java项目使用junit这篇文章演示了如何在Java 8之前的项目中使用JUnit 5,并解释了为什么它是一个好主意。 JUnit 5至少需要Java 8作为运行时环境,因此您想将整个项目更新为Java8。但是有时由于某些原因,您无法立即将项目更新为Java8。例如&am…

set cache php,TP5之Cache的原理及使用

在当今大流量的互联网之中,Cache的重要性不言而喻。ThinkPhp5作为国内主流框架,提供了强大的Cache功能。让我们跟随本文,来剖析TP5 Cache的原理及使用。为什么需要Cache(缓存)?假设现在有一个小说网,有非常多的读者,有一篇新的章节更新了,那…

IntelliJ IDEA for Mac 项目窗口详解(Project Windows)

Show Members:显示成员,打勾,类的成员,例如:方法、字段等会显示出来,如下图所示: Show Excluded Files:显示排除的文件 Show Visibility Icons:显示可见性图标&#xff…

jdk9与jdk11哪个好_JDK 9、10和11中的安全性增强

jdk9与jdk11哪个好缩短JDK发布周期的原因之一是有可能推出更快的安全错误修复和增强功能。 在本文中,我们将简要回顾一下最新JDK版本中引入的主要安全增强功能。 由于这些增强功能中的大多数与TLS相关,因此必须了解TLS握手过程,如下图所示&am…

对一个java源文件进行正确编译,给定如下一个Java源文件Child.java,编译并运行Child.java,以下结果正确...

给定如下一个Java源文件Child.java,编译并运行Child.java,以下结果正确答:编译错误:没有找到构造器 Parent1()中国大学MOOC: 图像分割是基于灰度值的两个基本特性()答:相似性 连续性合同是平等主体之间的 法律行为。答…

多云平台_多云系统的授权

多云平台这是我目前正在使用的项目设计,用于消耗SPIFFE( 受所有人保护的安全生产身份框架( )的信任和身份识别,在WSO2的Prabath Siriwardena先生的启发下,在Moratuwa大学的Gihan Dias教授的指导下&#xf…

XML的学习

文章目录XML 简介XML 语法XML 组成部分XML 约束DTD名称解释引用内部的 DTD引用外部的 DTDSchema语法格式详解命名空间前缀的意义XML 解析解析 XML 的方式(思想)解析器JSOUP 的使用JSOUP 入门快捷查询Jsoup 选择器查询XPathXML 简介 XML,Exte…

php 日期多余小时,在PHP中添加小时到日期时间

DateTime是PHP中的一个很棒的功能$string 1/1/2016 11.00PM;$date new DateTime($string);$interval new DateInterval(PT6H);$date->add($interval);// Now add another 6 hours while we are between 12:00 AM and 6:00 AMwhile($date->format(G) > 0 &&…

streaming api_通过Spring Integration消费Twitter Streaming API

streaming api1.概述 众所周知, Spring Integration具有用于与外部系统交互的大量连接器。 Twitter也不例外,而且很长一段时间以来,因为Spring Social一直是一个开箱即用的解决方案,Spring Integration利用该解决方案来连接到社交…

Linux命令之 mount -- 文件系统挂载

文章目录简介参考实例加载指定的分区参考简介 mount 命令用于加载文件系统到指定的加载点。此命令的最常用于挂载 cdrom,使我们可以访问 cdrom 中的数据,因为你将光盘插入 cdrom 中,Linux 并不会自动挂载,必须使用 Linux mount 命…

java 舍,java 4舍六入五成双

java 四舍六入五成双1. 小于5舍去,即舍去部分的数值小于保留部分的末位的半个单位,则末位不变;2. 大于5进1,即舍去部分的数值大于保留部分的末位的半个单位,则末位加1;3. 等于5时取偶数,即舍去部…

Linux命令之 umount -- 卸载文件系统

文章目录介绍参考介绍 umount 是“unmount”的缩写,译为“不挂载。所以它的”的作用是卸载已挂载的文件系统、目录或文件。 利用设备名或挂载点都能umount文件系统,不过最好还是通过挂载点卸载,以免使用绑定挂载(一个设备&#x…

aws技术峰会2018_AWS re:Invent 2018的5大公告

aws技术峰会2018AWS re:Invent刚刚完成。 这是一个巨大的活动,在拉斯维加斯7家最大的酒店中,有50,000多名与会者,并发布了许多新的服务公告。 无服务器端通过新的lambda增强功能和更好的容器支持继续受到很多关注。 AWS通过新的“…

php 降低图像大小,PHP图像重新调整大小

我有一个PHP脚本,可以重新调整JPEG图像的大小.但是,由于某种原因,图像被扭曲,即使我将其编程为按比例计算x或y(取决于照片方向).质量是100,所以我不明白为什么它会使它们扭曲.我究竟做错了什么?编辑原始图像为3264px x 2448px谢谢代码:$im ImageCreateF…

Linux命令之 mke2fs -- 格式化分区(为分区写入文件系统)

文章目录简介命令选项参考实例格式化指定的分区简介 在磁盘分区上创建 ext2、ext3、ext4 等文件系统,默认情况下会创建 ext2。 虽然 mkfs 命令非常简单易用,但其不能调整分区的默认参数(比如块大小是 4096 Bytes),这…