有些项目的源码在service服务层里边用app来调用model,为什么不直接用orderModel::where()->->first()查询,两种方式有什么大的区别吗

namespace App\Service;
use App\Models\orderModel;
class orderService {
    private function orderModel() {
        return app(orderModel::class);
    }
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 12
Mutoulee

可能就是为了解耦 :cry:

1年前 评论
wangyou (楼主) 1年前
陈先生 1年前

我个人理解是 单一职责原则 ,在服务层这样调用 orderModel::where()->first()违反了这个,这是主要的,其次就是降低耦合了

比如你要查询订单,你定义的查询方法只需要查就足够了,不需要知道来自哪个订单模型

1年前 评论

emmm,个人觉得这种写法属于过度设计了;就算是为了解耦,也是用 依赖反转 来实现...

1年前 评论

让代码更加内聚吧,不然该 Service 需要改模型名称就会存在多个地方修改,抽出来一个方法后就只要修改一个地方了。

1年前 评论

使用 app 函数的话,这里的 orderModel 是可替换的,可以在容器里面重新绑定一类的,写测试的时候,这个方法也可以被模拟掉。

不过可以考虑构造函数注入的形式。

直接 orderModel::xxxx 则不能做到,或者可以说更加麻烦。

1年前 评论
yyy123456 1年前

如果开发过java,就会非常熟悉这风格了.不会学java的php不是好laravel

1年前 评论
arunfung

可能是有其他语言经验的人写的,或者说还不理解IOC、依赖注入、可测试等工程化

1年前 评论

为方便 OrderModel 具体实现类的切换,比如,本来是 A/OrderModel ,重构了或作为库被人使用 可以自定义为 B/OrderModel ,然后绑定到IOC容器,那么这里 app(OrderModel::class) 返回的就是 B/OrderModel 的实例。

但是哦,个人喜好,大可不必如此

1年前 评论

就用 orderModel::where()->->first() 这种吧。套一层 app 毫无意义

1年前 评论

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