在实现服务时,基于Laravel's documentation,服务应该在服务提供者上注册,以便可以通过依赖注入将其注入到类中。但我确实注意到,即使我不创建这样的服务提供者,我仍然可以注入该类。
如果是这样,如果我可以直接注入它,那么服务提供者类的用途是什么?
以下是一些示例:
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();
}
}
答案 0 :(得分:4)
好问题!
Laravel的Container具有“自动解决”依赖关系的能力。如果您要求Container创建类的实例并且该类没有特定的绑定定义,则Container将尝试查找该类,使用PHP的Reflection功能检查其依赖关系,并递归构建依赖关系树,直到它完成或遇到问题。
即使具备此功能,使用服务提供商的用例和好处:
您希望将接口绑定到容器,并将其解析为具体类。接口无法直接实例化,因此您必须告诉容器要使用的具体类。
您的绑定具有非类依赖项,例如字符串配置值。这些无法自动解决。
自动接线速度很慢。它必须对没有服务提供者绑定的每个类使用Reflection。
您希望在解决过程中包含某种逻辑。
可能是其他一些我忘记的用例或好处,但这些应该是一个好的开始!