IoC 容器
介绍
Laravel 的控制反转 ( IoC, inversion of control ) 容器是管理类依赖的强力工具。 依赖注入 ( Dependency injection ) 是一种移除 hard-coded 类依赖的方式。相较之下,在执行的时候才注入依赖, 可以拥有更好的弹性,在替换依赖实体时相当容易。
理解 Laravel IoC 容器对于建立大型的应用程序,以及改进 Laravel 核心是很重要的。
基本用法
绑定类型到容器
IoC 容器有两种解析依赖的方式:经由闭包函数或自动解析。我们将先探索闭包函数的用法。首先,绑定一个「类型」到容器:
App::bind('foo', function($app)
{
return new FooBar;
});
从容器中解析类型
$value = App::make('foo');
当 App::make
方法被调用,绑定的闭包函数会被调用并返回结果。
绑定「共享」的类型到容器
有时候,您可能希望绑定到容器的类型只会被解析一次,之后的调用都返回相同的实例:
App::singleton('foo', function()
{
return new FooBar;
});
绑定已存在的实例到容器
您也可以使用 instance
方法,绑定一个已经存在的实例到容器:
$foo = new Foo;
App::instance('foo', $foo);
何处注册绑定
IoC 绑定跟「注册事件处理」或是「注册路由」一样,通常称为「引导代码」。换句话说,IoC 绑定后等待请求,在路由或控制器调用时才实际执行。像其他的「引导代码」一样,start
文件总是注册 IoC 绑定的一个选择。或者,您可以建立一个 app/ioc.php
文件(文件名不重要),并且从 start
文件引入。
如果您的应用程序有很多 IoC 绑定,或是想要分门别类,在不同文件组织绑定,您可以注册绑定在 服务提供者。
自动解析
在很多情境下,IoC 容器不需要额外设定就有能力自动解析类。例如:
class FooBar {
public function __construct(Baz $baz)
{
$this->baz = $baz;
}
}
$fooBar = App::make('FooBar');
虽然我们没有注册 FooBar 类绑定到容器,它还是可以解析类,甚至自动注入 Baz
!
如果容器里没有找到对应的类型绑定,容器会利用 PHP 的 Reflection 检查类,并且解读传入构造函数的类型提示。利用这些信息,让容器可以自动建立类实例。