关于 Laravel 容器的使用,大家都是什么情况下用?
我还没有很好的理解laravel容器。
我的理解是,容器里放了好多的可供调用的对象。
需要时可以直接使用,无需new等。
想问一下,大家都会用到这个特性么?
项目中一般怎么去用这个特性呢?是分出个service层,然后把各个service都放到容器里?
在controller里调用?
还是直接不用呢?
关于 LearnKu
高认可度评论:
我觉得不要纠结如何去使用,相反容器提供的是一种创建实例的方法,根据不同情况可以灵活选择。
这种方式使用的局限性就是这个 Work 消费类不可以使用 new 关键字创建实例,不能用
new Work(),必须使用容器的依赖注入。这个时候就可以通过new 创建一个 Work 的实例并传入到包中。
容器里面存储的实际上是一些key=>value的数组。其中key就是我们在方法注入的类型提示或者make()方法中的参数,实际上就是一个字符串。value代表的是实际上实例化的类。
服务提供者有什么作用呢?
如果你的key和value 是同一个的话,像 app(Work::class) 你想获得的就是 Work 的实例,传入的也是 Work 的类名,这个时候不用在服务提供者里面注册。
假如你 app(Work::class) 你想获得的是一个 WorkHard 的实例,这种情况下就需要在服务提供者里面注册,也就是告诉容器,当我访问Work::class这个key的时候,请给我一个 WorkHard 的实例。
服务容器绑定又有几个不同的方法,比如 bind() , singleton(), instance() 等,通常绑定一个接口到一个特定的类,会使用bind方法,如果需要获得一个单例的话,就用singleton()方法,singleton()会在注入的时候查找是否已经存在实例,存在的话直接返回而不是创建一个新的实例。instance()是绑定到一个已经存在的实例,我用的比较少。
当然一次性加载所有的服务提供者需要创建所有的实例,相对来说耗费资源吧,也可以在服务提供者里面设置为延迟加载,当真的使用到这个注入的时候才会创建。
一点小心得,欢迎指正。
@lx1036 感谢细致回答。
我的意思是项目中自己使用更多的使用。
比如是否需要分service层
然后用这种方式去调用
我觉得不要纠结如何去使用,相反容器提供的是一种创建实例的方法,根据不同情况可以灵活选择。
这种方式使用的局限性就是这个 Work 消费类不可以使用 new 关键字创建实例,不能用
new Work(),必须使用容器的依赖注入。这个时候就可以通过new 创建一个 Work 的实例并传入到包中。
容器里面存储的实际上是一些key=>value的数组。其中key就是我们在方法注入的类型提示或者make()方法中的参数,实际上就是一个字符串。value代表的是实际上实例化的类。
服务提供者有什么作用呢?
如果你的key和value 是同一个的话,像 app(Work::class) 你想获得的就是 Work 的实例,传入的也是 Work 的类名,这个时候不用在服务提供者里面注册。
假如你 app(Work::class) 你想获得的是一个 WorkHard 的实例,这种情况下就需要在服务提供者里面注册,也就是告诉容器,当我访问Work::class这个key的时候,请给我一个 WorkHard 的实例。
服务容器绑定又有几个不同的方法,比如 bind() , singleton(), instance() 等,通常绑定一个接口到一个特定的类,会使用bind方法,如果需要获得一个单例的话,就用singleton()方法,singleton()会在注入的时候查找是否已经存在实例,存在的话直接返回而不是创建一个新的实例。instance()是绑定到一个已经存在的实例,我用的比较少。
当然一次性加载所有的服务提供者需要创建所有的实例,相对来说耗费资源吧,也可以在服务提供者里面设置为延迟加载,当真的使用到这个注入的时候才会创建。
一点小心得,欢迎指正。