求证,控制器和service、service和service间参数传递和验证
- 路由模型绑定时,将
id
转换为对应模型,控制器接收模型实例,service层参数接收应该怎么设计?是接收模型实例还是接收id
参数好些?// service中 public function update($noteId, $validated) /// or public function update(Note $note, $validated)
- 如果接收模型实例,要保证实例中存在需要的属性,只能在方法中手动验证吗?比如要确定
deleted_at
是否存在在模型中👇,$model->offsetExists('deleted_at')
service
层的方法,存在互相调用,参数验证应该怎么做?目前是在controller
中使用的form request
,然后传递验证后的数据给service
👇,这样A service
调用当前service
的方法,需要在A
中验证参数还是在当前service
中验证参数,通过什么验证?//controller public function foobar(StoreFoobarRequest $request) { $this->service->store($request->safe()); }
如果能通过引入别的层来解决问题,也是极好的,(☆▽☆)
如果你认为外部传入对象是不可信的,那就只能传递 ID。
如果你的业务中很容易遇到这种,有模型要传递的情况,那么你再创建一个
updateForModel
方法,用来接收模型,update
方法用来接收 ID,update
方法内部调用updateForModel
,即实现重载。还可以使用 getter、setter 的方式,把这些参数声明成类属性来调用。
比如声明
$note
属性类型为Note|int
即同时接受模型和 int 参数类型,在 setter 或者 getter 方法里面去处理(使最终拿到模型,毕竟你需要使用)。传递给 Service 的参数,应该始终是最终可用的,即 Service 里面不做参数验证,而是在方法签名上就定义类型的形式来限定。