Wann wird Laravel das, was ich schreibe, an den Dienstanbieter weitergeben?
黄舟
黄舟 2017-05-16 16:47:48
0
3
370

Zum Beispiel habe ich im APP-Verzeichnis ein neues Verzeichnis „Dienste“ erstellt und darin einen Dienst zum Senden von E-Mails, EmailService.php, abgelegt. Wenn ich ihn in anderen Controllern aufrufen möchte, kann ich direkt zitieren:

use App\Services\EmailService;

Auf diese Weise können Sie es normal verwenden.

Dann lautet die Frage:
1 Wenn es normal wie oben verwendet werden kann, unter welchen Umständen sollte dieser Dienst im Dienstanbieter platziert werden? 服务放到服务提供者里面去?
2、服务提供者服务容器之间的关系一直搞不太清楚,究竟服务是放到服务容器里面还是服务提供者里面?服务提供者服务容器2. Die Beziehung zwischen Service-Provider und Service-Container war nie klar >Innerhalb oder Dienstleister? Was sind die jeweiligen Verantwortlichkeiten von Service Provider und Service Container?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

Antworte allen(3)
習慣沉默

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

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

洪涛

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

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

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

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

我想大声告诉你

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

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

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

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

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

敬请指正。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage