Php 即使没有服务提供商,Laravel服务类也可以工作?
在实现基于的服务时,应该在服务提供者上注册服务,以便通过依赖项注入将其注入到类中。但我注意到,即使我没有创建这样的服务提供者,我仍然可以注入该类 如果是这样的话,如果我可以直接注入服务提供者类,它有什么用呢 以下是一些示例:Php 即使没有服务提供商,Laravel服务类也可以工作?,php,laravel,service,dependency-injection,Php,Laravel,Service,Dependency Injection,在实现基于的服务时,应该在服务提供者上注册服务,以便通过依赖项注入将其注入到类中。但我注意到,即使我没有创建这样的服务提供者,我仍然可以注入该类 如果是这样的话,如果我可以直接注入服务提供者类,它有什么用呢 以下是一些示例: use App\Http\Service\MailerService; class MailerServiceProvider extends ServiceProvider { public function register() { $
use App\Http\Service\MailerService;
class MailerServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton(MailerService::class, function($app) {
return new MailerService();
});
}
}
class MailerService
{
public function send()
{
// do something here
}
}
class MailerController
{
public function sendEmail(MailerService $mailerService)
{
$mailerService->send();
}
}
好问题
Laravel的容器能够“自动解析”依赖项。如果您要求容器创建一个类的实例,但该类没有特定的绑定定义,那么容器将尝试查找该类,使用PHP的反射功能检查其依赖关系,并递归地构建依赖关系树,直到完成或遇到问题为止
使用具有此功能的服务提供商的用例和好处:
- 您希望将接口绑定到容器,并将其解析为具体类。接口不能直接实例化,所以您必须告诉容器要使用哪个具体类
- 绑定具有非类依赖项,例如字符串配置值。这些问题无法自动解决
- 自动布线速度慢。它必须对每个没有服务提供者绑定的类使用反射
- 您希望在解析过程中包含某种逻辑