member-doc/quick-dev/service.md

60 lines
2.0 KiB
Markdown
Raw Permalink Normal View History

2022-06-14 11:36:15 +00:00
## 服务
目前除了RiskControl层外所有的新建服务必须继承 BaseService 并且实现 LogicServiceContract 接口即app/Service/RiskControl 下文件除外。
这样继承之后新的服务就会自动依赖ApiConfigService数据并且提供setData($data),setId($id)自定义依赖数据源。
开发者在任何一个服务类中$this->data 获取前端或外部输入数据。
## 创建公共服务
在app/Service/Common 新建公共服务文件
## 创建逻辑服务
在app/Service/LogicModule 新建服务文件。
1. 建议开发者新建逻辑服务,应该考虑功能模块划分,将复杂功能拆分若干细小的模块,减少模块之间耦合性。
2. 建议开发者处理好interface与class 实现类的关系它们之间应该是一对多关系interface属于高级别约束而非实现类方法定义集合。
## 服务之间调用
### 通过make调用
```php
//通过make 调用 TaskService 触发任务
make(TaskService::class)->triggerTaskInner([
'task_key' => $task,
'options' => [
'member_id' => $member_id
]
]);
```
### 通过services() 函数调用
```php
// 通过services() 调用MemberSaveService 执行checkMember
public function add(array $data): array
{
//
/**
* @var MemberSaveService $service
*/
$service = services(MemberSaveService::class);
$this->checkMember($data);
}
```
### 为什么不建议使用容器获取或注解?
使用Di或注解虽然可以高并发提供内存占用以及免去class 重复创建性能损耗但容器或注解会使依赖对象变为单列对象均不能包含状态值。因此破坏了oop 部分设计模式的拓展和应用,反而是限制了服务或对象的拓展以及延申。对于业务逻辑代码每次跟随请求变化,短生命周期更容易开发&维护。
如果某些场景需要长生命周期,应使用协程上下文来保存依赖对象或数据。