这两种其实都不好,因为不能直接从Service的接口(或函数签名)看出它需要的参数。

对于参数很多的方法,可以用对象表示参数,控制器根据Request封装得到对象(对象也可以提供一个fromRequest方法)再传给Service。

补充个例子,UserService的getList可以这样定义:

public function getList(UserCriteria criteria, $limit = 10, $offset = 0) {

...

}

看函数签名就可以知道第一个参数是UserCriteria,后面的$limit和$offset是分页用的,也可以再封装成一个类,但是没必要。

其中的UserCriteria就是查找和筛选用户的条件:

class UserCriteria

{

public $name;

public $age;

// ... 很多其他参数

public static function fromRequest(Request $req)

{

$instance = new static;

$instance->name = $req->input('name');

// ... 很多其他参数

return $instance;

}

}

在控制器调用:

public function index(Request $req)

{

$criteria = UserCriteria::fromRequest($req);

$userList = $this->userService->getList($criteria, 10);

// ...

}

好处:

明确的类型(IDE还能自动补全)

隔离HTTP请求

php服务层设计与实现的,PHP中service层怎么设计兼顾优雅和方便?相关推荐

  1. 如何应用好计算机教学设计,信息技术在教学活动中的应用教学设计

    信息技术在教学活动中的应用教学设计 信息技术,是主要用于管理和处理信息所采用的各种技术的总称.下面是小编整理的关于信息技术在教学活动中的应用教学设计,希望大家认真阅读! [1]信息技术在教学活动中的应 ...

  2. 3、JavaWeb中Service层的作用、MyBatis的重要组件、mybatis-config.xml中的别名映射、properties配置、#{}和${}的区别、获取插入数据的主键值

    文章目录 1.Service层的作用 2.MyBatis重要组件 Resources SqlSessionFactoryBuilder SqlSessionFactory SqlSession 针对上 ...

  3. 中service层的作用_浅析Java中dto、dao、service、controller的四层结构

    目前我所在的项目组采用的是SpringBoot框架,前端使用BootStrap+jQuery. SpringBoot是BS开发框架之一,不用单独开启tomcat服务器,目前比较流行,一般开发大型项目时 ...

  4. springboot中service层注入的是实现类,但Controller层接收的是接口

    我们习惯这样编写代码: 在service层写接口,然后用实现类去实现接口,并且将实现类注入到容器中 @Service public class AccountServiceImpl implement ...

  5. Spring中service层与dao(mapper)层

    一.dao(mapper)层 DAO层叫数据访问层,全称为data access object,持久层直接和数据库打交道,具体到对于某个表的增删改查,封装了增删改查基本操作. 二.Service层 S ...

  6. maven子项目中service层无法依赖Failed to execute goal on project

    1.项目结构是一个父项目,多个子项目目录如下: 2.子项目分别为maven_dao.maven_service和maven_controller这三个项目, 三个项目都继承父项目 3.在模块中serv ...

  7. SpringBoot中Service层事务控制

    SpringBoot中使用事务比较简单,在Application启动类上添加@EnableTransactionManagement注解,然后在service层的方法上添加@Transactional ...

  8. 自定义工具类Static方法调用业务中Service层方法

    文章目录 前言 一.如何实现? 二.Util工具类实现 代码相关注解 总结 前言 今天需要验证OpenId,来看是否为系统用户,直接封装一个工具类,遇到了调用业务层service的方法.记一次学习笔记 ...

  9. mysql 文章 字段设计_在mysql数据库中,文章表设计有啥好的思路

    Q: 用mysql设计一张文章表,不知道有啥好的思路! 我是这样的,应为考虑附件和图片,所以我的文章表除了有varchar(1000)的文章内容,还设置了个Bolb接收附件和图片. 我用的是mysql ...

最新文章

  1. 敲的php代码怎么预览,php代码实现文件的预览
  2. vijos - P1279Leave-绿光(数学归纳法 + python)
  3. CentOS配置网易163 yum源和EPEL yum源
  4. 补充 宝玉 之《URL欺骗之以假乱真!》之 POST 方法提交数据 之 处理!
  5. 几个shell小脚本
  6. postgres 把一个表的值转成另一个表的字段名_用LUT来做一个可动态配置的卷积核...
  7. python requests库 response_Pytest 如何模拟 requests库中的Response对象?
  8. Android基础之Intent的几种常用方法
  9. Python Extension
  10. ASP.NET的Application简介1
  11. PCWorld:火狐浏览器已宣告死亡【转】
  12. python网络编程基础知识_Python 网络编程基础入门
  13. IP子网划分概念:IP地址,子网和网关配置——Vecloud
  14. 2018年12计算机应用基础统考,2018年12月统考通知
  15. 联发科mt8516价格_联发科MT8516销量破两亿:揭秘背后的故事
  16. 清华大学鲍橒计算机1999,《最强大脑》鲍橒:世界盲棋第一人的最强记忆
  17. 【VMware环境下Linux磁盘空间(LVM)扩容方法】
  18. 年薪超过 50 万的程序员在哪些公司工作?
  19. linux7没有ifconfig,CentOS 7 没有ifconfig新的替换命令ip
  20. kedacom摄像头怎么预置_[功能测评]科达(Kedacom)200万红外网络摄像机

热门文章

  1. RISC-V 能打 50 年!不必期待 RISC-VI —— 对话 RISC-V CTO Mark Himelstein
  2. 详解微软 ALUM:当语言模型遇到对抗训练
  3. 谈了千百遍的缓存数据一致性问题
  4. 2020 OPPO 开发者大会重磅推出 ColorOS 11,适配机型达 33 种
  5. 真的,没人能逃开“真香定律”
  6. 小米新生态总监董红光:致力打造智能服务开放平台
  7. 英特尔“宠坏”程序员!
  8. 公开课|百度天工物联网基础平台的微服务容器化落地实践
  9. 顶配 12699 元、没有 5G,“浴霸三摄”的 iPhone 到底长什么样?
  10. V神已抵京,倒计时4天!6大理由告诉你为什么要参加“2019以太坊技术及应用大会”...