概述
概述
任何时候,你在一个控制器类中请求一个依赖,这个服务容器负责:
1.自动地在构造函数中检测依赖关系
2.如果需要构建这个依赖关系
3.通过构造函数创建对象形成依赖关系
来看一个非常简单的例子。
<?php namespace AppHttpControllers; use AppUser; use AppRepositoriesUserRepository; use AppHttpControllersController; class UserController extends Controller { protected $userRepository; public function __construct(UserRepository $userRepository) { $this->userRepository = $userRepository; } public function show($id) { $user = $this->userRepository->find($id); return view('user.profile', ['user' => $user]); } }
假如,你有一个UserController类需要UserRepository作为一个构造函数依赖。
1.服务容器使用PHP的反射类来检测,事实UserRepository需要被优先解析。
2.然后,它构造UserRepository实例。
3.然后,它构造UserController类实例。
依赖关系是如何被解析和注入的,我被很多Laravel开发人员不知道这个简单而强大的技术感到迷惑。 这是一个非常强大的技术,它可以被用来解决复杂对象的依赖关系。
如果由于某种原因,您不希望Laravel自动构建一个对象,您还可以通过传递一个可用于创建依赖关系的回调来告诉Laravel Service Container如何构造该对象。
<?php $container->bind('MyService', function($container) { return new MyService($container->make('MyAnotherService')); });
您需要创建一个服务提供商来注册上述服务。
<?php namespace AppProviders; use IlluminateSupportServiceProvider; class MyServiceProvider extends ServiceProvider { public function register() { $this->app->singleton(MyService::class, function ($app) { return new MyService($app->make('MyAnotherService')); }); } }
当MyService需要被解析的时候,负责返回一个对象的回调函数就会被调用。
<?php namespace AppHttpControllers; use AppUser; use AppHttpControllersController; class MyController extends Controller { protected $myService; public function __construct(MyService $myService) { $this->myService = $myService; } // .. 方法 }
真实的例子
假设你的应用需要Facebook的PHP SDK来访问Facebook的API,你的控制器就是这样的:
<?php namespace AppHttpControllers; use AppUser; use AppHttpControllersController; use FacebookFacebook; class FacebookApiAccessController extends Controller { protected $facebook; public function __construct(FacebookFacebook $facebook) { $this->facebook = $facebook; } //.. action methods here }
现在,您需要告诉Service Container如何构建FacebookFacebook的实例.
<?php $container->singleton('FacebookFacebook', function() { return new FacebookFacebook([ 'app_id' => config('services.facebook.app_id'), 'app_secret' => config('services.facebook.app_secret'), 'default_graph_version' => 'v2.10', ]); });
注意,我已经调用了方法singleton而不是bind。 唯一的区别是用singleton注册的服务被缓存,随后的解析服务调用返回缓存的服务。
结论
依赖注入是一种强大的技术,你可以在Laravel中用来简化对象的创建. 默认情况下,Laravel的服务容器会自动的用反射去检测和解决依赖关系. 但是, 你可以指定回调来解析服务.
以上就是详解Laravel框架的依赖注入功能的详细内容,更多关于Laravel框架的依赖注入功能的资料请关注靠谱客其它相关文章!
最后
以上就是哭泣花生为你收集整理的详解Laravel框架的依赖注入功能的全部内容,希望文章能够帮你解决详解Laravel框架的依赖注入功能所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复