且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

laravel - PHP中service层怎么设计兼顾优雅和方便?

更新时间:2023-12-03 20:31:23

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

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

补充个例子,UserServicegetList可以这样定义:

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);
    // ...
}

好处:

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

  2. 隔离HTTP请求