文章转发自专业的Laravel开发者社区,原始连接:learnku.com/laravel/t/7…php
这个 StackOverflow回答 完美的解释了依赖注入这个概念laravel
从根本上说,依赖注入不是让对象建立一个依赖关系,也不是让工厂对象去建立对象,而是将所需的依赖变成一个外部对象,使之成为一个"某些人的问题”缓存
你为"某些人的问题”注入了类的依赖关系。在Laravel中,这个"某人”是 服务容器 。在Laravel中,服务容器负责经过构造函数注入类的依赖关系。bash
任什么时候候,你在一个控制器类中请求一个依赖,这个服务容器负责:app
来看一个很是简单的例子。ide
<?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
做为一个构造函数依赖。函数
PHP
的 反射类 来检测,事实 UserRepository
须要被优先解析。UserRepository
实例。UserController
类实例。依赖关系是如何被解析和注入的,我被不少 Laravel
开发人员不知道这个简单而强大的技术感到迷惑。 这是一个很是强大的技术,它能够被用来解决复杂对象的依赖关系。ui
若是因为某种缘由,您不但愿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
须要被解析的时候,负责返回一个对象的回调函数就会被调用。
<?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,你的控制器就是这样的:
<?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
的服务容器会自动的用反射去检测和解决依赖关系. 可是, 你能够指定回调来解析服务.