求证,控制器和service、service和service间参数传递和验证

  1. 路由模型绑定时,将 id 转换为对应模型,控制器接收模型实例,service层参数接收应该怎么设计?是接收模型实例还是接收 id 参数好些?
    // service中
    public function update($noteId, $validated)
    /// or 
    public function update(Note $note, $validated)
  2. 如果接收模型实例,要保证实例中存在需要的属性,只能在方法中手动验证吗?比如要确定 deleted_at是否存在在模型中👇,
    $model->offsetExists('deleted_at')
  3. service 层的方法,存在互相调用,参数验证应该怎么做?目前是在 controller 中使用的 form request,然后传递验证后的数据给 service👇,这样 A service 调用当前 service 的方法,需要在 A 中验证参数还是在当前 service中验证参数,通过什么验证?
    //controller
    public function foobar(StoreFoobarRequest $request)
    {
     $this->service->store($request->safe());
    }

如果能通过引入别的层来解决问题,也是极好的,(☆▽☆)

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

如果你认为外部传入对象是不可信的,那就只能传递 ID。

如果你的业务中很容易遇到这种,有模型要传递的情况,那么你再创建一个 updateForModel 方法,用来接收模型,update 方法用来接收 ID, update 方法内部调用 updateForModel,即实现重载。

还可以使用 getter、setter 的方式,把这些参数声明成类属性来调用。

比如声明 $note 属性类型为 Note|int 即同时接受模型和 int 参数类型,在 setter 或者 getter 方法里面去处理(使最终拿到模型,毕竟你需要使用)。

传递给 Service 的参数,应该始终是最终可用的,即 Service 里面不做参数验证,而是在方法签名上就定义类型的形式来限定。

2年前 评论
讨论数量: 4

如果你认为外部传入对象是不可信的,那就只能传递 ID。

如果你的业务中很容易遇到这种,有模型要传递的情况,那么你再创建一个 updateForModel 方法,用来接收模型,update 方法用来接收 ID, update 方法内部调用 updateForModel,即实现重载。

还可以使用 getter、setter 的方式,把这些参数声明成类属性来调用。

比如声明 $note 属性类型为 Note|int 即同时接受模型和 int 参数类型,在 setter 或者 getter 方法里面去处理(使最终拿到模型,毕竟你需要使用)。

传递给 Service 的参数,应该始终是最终可用的,即 Service 里面不做参数验证,而是在方法签名上就定义类型的形式来限定。

2年前 评论

我的习惯 很少丢对象 一般都是丢id 方便解耦

2年前 评论
Bear_zheng

1.传递id会浪费之前绑定的模型,会遇到在服务层内需要这个模型怎么再获取的问题,不管从持久化还是缓存获取都是比较浪费时间的。如果要传递id,可以做一下进程内缓存

2、3是类似的,服务层方法需要使用合法的参数,参数有问题需要在方法外做校验,无效的话不需要调用。

2年前 评论
porygonCN

我的习惯是传model, 一般跟客户端对接的只有controller 而其他部分都是内部调用, 甚至controller调用service的方法也是内部调用. 那么数据就应该是可信的. 不需要再做额外的校验. 至于service中想校验字段存不存在, 基于前面的话 传递过来的model是可信的 所以不用校验. 或者 如果真不确定 可以 $model->refresh() 从数据库重新获取一遍

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!