当前位置: 首页 > 后端技术 > PHP

从另一个角度来分析 Laravel 框架的依赖注入功能

时间:2023-03-29 18:29:16 PHP

从另一个角度来分析Laravel框架的依赖注入功能注入的概念从根本上说,依赖注入不是让一个对象创建一个依赖,也不是让一个工厂对象创建一个对象,而是把需要的依赖变成一个外部对象,使其成为“某人的问题”“你为”某人的问题“注入了类的依赖项。在Laravel中,这个“某人”是服务容器。在Laravel中,服务容器负责通过以下方式注入类的依赖项构造函数。任何时候你在控制器类中请求依赖,服务容器负责:自动检测构造函数中的依赖如果需要构建依赖,则通过构造函数创建对象以形成依赖让我们看一个非常简单的例子。userRepository=$userRepository;}publicfunctionshow($id){$user=$this->userRepository->find($id);returnview('user.profile',['user'=>$user]);}}假设您有一个UserController类,它需要UserRepository作为构造函数依赖项。服务容器使用PHP的反射类检测,需要先解析UserRepository这个事实。然后,它构造一个UserRepository实例。然后,它构造UserController类实例。如何解决和注入依赖关系,我对有多少Laravel开发人员不知道这种简单而强大的技术感到困惑。这是一种非常强大的技术,可用于解决复杂对象的依赖关系。如果出于某种原因你不希望Laravel自动构建对象,你也可以通过传递可用于创建依赖项的回调来告诉Laravel服务容器如何构建对象。bind('My\Service',function($container){returnnewMy\Service($container->make('My\AnotherService'));});您需要创建一个服务来提供商家注册上述服务。app->singleton(\My\Service::class,function($app){返回新\My\Service($app->make('My\AnotherService'));});}}当My\Service需要解析时,会调用负责返回对象的回调函数。myService=$myService;}//..Method}真实示例假设您的应用需要Facebook的PHPSDK来访问Facebook的API,您的控制器将如下所示:facebook=$facebook;}//..actionmethodshere}现在,您需要告诉服务容器如何构建Facebook\Facebook的实例。singleton('Facebook\Facebook',function(){returnnew\Facebook\Facebook(['app_id'=>配置('services.facebook.app_id'),'app_secret'=>配置('services.facebook.app_secret'),'default_graph_version'=>'v2.10',]);});请注意,我调用了方法singleton而不是bind唯一的区别是使用singleton注册的服务被缓存,随后的resolve服务调用返回缓存的服务。结论依赖注入是一种强大的技术,您可以在Laravel中使用它来简化对象的创建。默认情况下,Laravel的服务容器会自动使用反射来检测和解决依赖关系。但是,您可以指定回调来解析服务。