搜索

首页  >  问答  >  正文

laravel什么时候要把写的东西放到服务提供者里面去?

比如我在APP目录下新建了一个目录Services,里面放了一个发送邮件的服务EmailService.php,我要在其他控制器中调用的时候,我可以直接引用:

use App\Services\EmailService;

这样就可以正常使用了。

那么问题来了:
1、像上面那样已经可以正常使用,那什么情况下要把这个服务放到服务提供者里面去?
2、服务提供者服务容器之间的关系一直搞不太清楚,究竟服务是放到服务容器里面还是服务提供者里面?服务提供者服务容器他们各自的职责是什么?

黄舟黄舟2753 天前374

全部回复(3)我来回复

  • 習慣沉默

    習慣沉默2017-05-16 16:49:48

    服务提供者服务放进服务容器

    补个依赖注入容器的介绍:Learn to Stop Wiring and Love Laravel's Container

    回复
    0
  • PHP中文网

    PHP中文网2017-05-16 16:49:48

    题主会问这个问题,我猜题主对于依赖注入和laravel的服务容器还有所不了解。(当然我也不是非常了解,下面只是我比较浅显的理解)

    如果你直接在你的控制器内部指定某个命名空间下的类(这个类应该是是一个接口(契约)的实现),那么这个类就和这个控制器耦合了。当你想要修改这个实现类的时候,你就需要修改控制器,和控制器内调用的方法。

    如果你是在服务提供者里面写,一是可以解耦合(控制器方法的参数通过类型提示的方式把服务实现类注入进去),二是如果这个服务还依赖了别的服务,laravel的服务容器会自动处理这些依赖关系。而不是你自己在控制器前面用一堆use语法把这些依赖库导入进来。三是通过接口约束了这个服务只提供他应该提供的方法(职责单一)。

    一点浅薄理解,如有错欢迎在评论区指出。

    回复
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-16 16:49:48

    服务容器和服务提供者是两个东西,没有任何强制关联,所以,以下我把他们分开来讲。

    服务容器:
    是一个全局关联数组变量,把东西存在里面,然后在任何地方可以凭名字取出这个对象。

    服务提供者:
    每一个服务提供者里面,都有一段整个程序都会使用到的初始化代码,例如

    在应用初始化时加载路由定义
    注册某类观察者
    连接数据库并将db实例存放到服务容器

    从上面例子我们可以看出,这些初始化代码,我们总是要写的。只是laravel将其定义为一个规范了,强行让你给初始化代码分类存放。(你仍然可以把不同类型的初始化代码全塞在app/Providers/AppServiceProvider.php

    敬请指正。

    回复
    0
  • 取消回复