有些项目的源码在service服务层里边用app来调用model,为什么不直接用orderModel::where()->->first()查询,两种方式有什么大的区别吗
namespace App\Service;
use App\Models\orderModel;
class orderService {
private function orderModel() {
return app(orderModel::class);
}
}
可能就是为了解耦 :cry:
我个人理解是 单一职责原则 ,在服务层这样调用
orderModel::where()->first()
违反了这个,这是主要的,其次就是降低耦合了比如你要查询订单,你定义的
查询方法
只需要查就足够了,不需要知道来自哪个订单模型
emmm,个人觉得这种写法属于过度设计了;就算是为了解耦,也是用 依赖反转 来实现...
让代码更加内聚吧,不然该
Service
需要改模型名称就会存在多个地方修改,抽出来一个方法后就只要修改一个地方了。使用
app
函数的话,这里的orderModel
是可替换的,可以在容器里面重新绑定一类的,写测试的时候,这个方法也可以被模拟掉。不过可以考虑构造函数注入的形式。
直接
orderModel::xxxx
则不能做到,或者可以说更加麻烦。如果开发过java,就会非常熟悉这风格了.不会学java的php不是好laravel
可能是有其他语言经验的人写的,或者说还不理解IOC、依赖注入、可测试等工程化
为方便 OrderModel 具体实现类的切换,比如,本来是 A/OrderModel ,重构了或作为库被人使用 可以自定义为 B/OrderModel ,然后绑定到IOC容器,那么这里 app(OrderModel::class) 返回的就是 B/OrderModel 的实例。
但是哦,个人喜好,大可不必如此
就用 orderModel::where()->->first() 这种吧。套一层 app 毫无意义