文章转发自专业的Laravel开发者社区,原始连接: https://learnku.com/laravel/t...
这个 StackOverflow回答 完美的解释了依赖注入这个概念php
从根本上说,依赖注入不是让对象建立一个依赖关系,也不是让工厂对象去建立对象,而是将所需的依赖变成一个外部对象,使之成为一个"某些人的问题”
你为"某些人的问题”注入了类的依赖关系。在Laravel中,这个"某人”是 服务容器 。在Laravel中,服务容器负责经过构造函数注入类的依赖关系。laravel
任什么时候候,你在一个控制器类中请求一个依赖,这个服务容器负责:缓存
来看一个很是简单的例子。app
<?php namespace App\Http\Controllers; use App\User; use App\Repositories\UserRepository; use App\Http\Controllers\Controller; 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
做为一个构造函数依赖。ide
PHP
的 反射类 来检测,事实 UserRepository
须要被优先解析。UserRepository
实例。UserController
类实例。依赖关系是如何被解析和注入的,我被不少 Laravel
开发人员不知道这个简单而强大的技术感到迷惑。 这是一个很是强大的技术,它能够被用来解决复杂对象的依赖关系。函数
若是因为某种缘由,您不但愿Laravel自动构建一个对象,您还能够经过传递一个可用于建立依赖关系的回调来告诉Laravel Service Container如何构造该对象。this
<?php $container->bind('My\Service', function($container) { return new My\Service($container->make('My\AnotherService')); });
您须要建立一个服务提供商来注册上述服务。spa
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class MyServiceProvider extends ServiceProvider { public function register() { $this->app->singleton(\My\Service::class, function ($app) { return new \My\Service($app->make('My\AnotherService')); }); } }
当 My\Service
须要被解析的时候,负责返回一个对象的回调函数就会被调用。.net
<?php namespace App\Http\Controllers; use App\User; use App\Http\Controllers\Controller; class MyController extends Controller { protected $myService; public function __construct(\My\Service $myService) { $this->myService = $myService; } // .. 方法 }
假设你的应用须要Facebook的PHP SDK来访问Facebook的API,你的控制器就是这样的:code
<?php namespace App\Http\Controllers; use App\User; use App\Http\Controllers\Controller; use Facebook\Facebook; class FacebookApiAccessController extends Controller { protected $facebook; public function __construct(Facebook\Facebook $facebook) { $this->facebook = $facebook; } //.. action methods here }
如今,您须要告诉Service Container如何构建 Facebook\Facebook
的实例.
<?php $container->singleton('Facebook\Facebook', function() { return new \Facebook\Facebook([ 'app_id' => config('services.facebook.app_id'), 'app_secret' => config('services.facebook.app_secret'), 'default_graph_version' => 'v2.10', ]); });
注意,我已经调用了方法singleton
而不是bind
。 惟一的区别是用singleton
注册的服务被缓存,随后的解析服务调用返回缓存的服务。
依赖注入是一种强大的技术,你能够在 Laravel
中用来简化对象的建立. 默认状况下, Laravel
的服务容器会自动的用反射去检测和解决依赖关系. 可是, 你能够指定回调来解析服务.