php中的service层,【php】PHP中service层怎么设计兼顾优雅和方便?

比如我的列表页,因为查询参数比较多,查询条件也多,排序方式也比较多。

之前是把http的request查询参数通过数组传到service 但是发现很多不方便,比如我上传 比如我列表搜索页。

直接在service里调用request,这样感觉方便的多。

比如之前这样的:

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

现在改成这样

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

回答

这两种其实都不好,因为不能直接从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请求

但是耦合度会不会比较高呢?

不要紧的,你看laravel的分页不也是直接从Request获取参数吗。并不会有问题啊。 🙂

用queryscope

结合模板方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值