比如我在APP目录下新建了一个目录Services,里面放了一个发送邮件的服务EmailService.php,我要在其他控制器中调用的时候,我可以直接引用:
use App\Services\EmailService;
这样就可以正常使用了。
那么问题来了:
1、像上面那样已经可以正常使用,那什么情况下要把这个服务
放到服务提供者
里面去?
2、服务提供者
、服务容器
之间的关系一直搞不太清楚,究竟服务
是放到服务容器
里面还是服务提供者
里面?服务提供者
和服务容器
他们各自的职责是什么?
習慣沉默2017-05-16 16:49:48
在服务提供者
把服务
放进服务容器
。
补个依赖注入容器的介绍:Learn to Stop Wiring and Love Laravel's Container
PHP中文网2017-05-16 16:49:48
题主会问这个问题,我猜题主对于依赖注入和laravel的服务容器还有所不了解。(当然我也不是非常了解,下面只是我比较浅显的理解)
如果你直接在你的控制器内部指定某个命名空间下的类(这个类应该是是一个接口(契约)的实现),那么这个类就和这个控制器耦合了。当你想要修改这个实现类的时候,你就需要修改控制器,和控制器内调用的方法。
如果你是在服务提供者里面写,一是可以解耦合(控制器方法的参数通过类型提示的方式把服务实现类注入进去),二是如果这个服务还依赖了别的服务,laravel的服务容器会自动处理这些依赖关系。而不是你自己在控制器前面用一堆use语法把这些依赖库导入进来。三是通过接口约束了这个服务只提供他应该提供的方法(职责单一)。
一点浅薄理解,如有错欢迎在评论区指出。
我想大声告诉你2017-05-16 16:49:48
服务容器和服务提供者是两个东西,没有任何强制关联,所以,以下我把他们分开来讲。
服务容器:
是一个全局关联数组变量,把东西存在里面,然后在任何地方可以凭名字取出这个对象。
服务提供者:
每一个服务提供者里面,都有一段整个程序都会使用到的初始化代码,例如
在应用初始化时加载路由定义
注册某类观察者
连接数据库并将db实例存放到服务容器
从上面例子我们可以看出,这些初始化代码,我们总是要写的。只是laravel将其定义为一个规范了,强行让你给初始化代码分类存放。(你仍然可以把不同类型的初始化代码全塞在app/Providers/AppServiceProvider.php
)
敬请指正。