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
?
在
服务提供者
把服务
放进服务容器
。补个依赖注入容器的介绍:Learn to Stop Wiring and Love Laravel's Container
题主会问这个问题,我猜题主对于依赖注入和laravel的服务容器还有所不了解。(当然我也不是非常了解,下面只是我比较浅显的理解)
如果你直接在你的控制器内部指定某个命名空间下的类(这个类应该是是一个接口(契约)的实现),那么这个类就和这个控制器耦合了。当你想要修改这个实现类的时候,你就需要修改控制器,和控制器内调用的方法。
如果你是在服务提供者里面写,一是可以解耦合(控制器方法的参数通过类型提示的方式把服务实现类注入进去),二是如果这个服务还依赖了别的服务,laravel的服务容器会自动处理这些依赖关系。而不是你自己在控制器前面用一堆use语法把这些依赖库导入进来。三是通过接口约束了这个服务只提供他应该提供的方法(职责单一)。
一点浅薄理解,如有错欢迎在评论区指出。
服务容器和服务提供者是两个东西,没有任何强制关联,所以,以下我把他们分开来讲。
服务容器:
是一个全局关联数组变量,把东西存在里面,然后在任何地方可以凭名字取出这个对象。
服务提供者:
每一个服务提供者里面,都有一段整个程序都会使用到的初始化代码,例如
从上面例子我们可以看出,这些初始化代码,我们总是要写的。只是laravel将其定义为一个规范了,强行让你给初始化代码分类存放。(你仍然可以把不同类型的初始化代码全塞在
app/Providers/AppServiceProvider.php
)敬请指正。