基本用法
最后更新于:2022-04-01 15:04:44
## 绑定
几乎你所有服务容器将与已注册的服务提供者绑定,这些例子都在情境(context)使用容器做说明,如果应用程序其它地方需要容器实例,如工厂(factory),能以类型提示 Illuminate\Contracts\Container\Container 注入一个容器实例。另外,你可以使用 App facade 访问容器。
### 注册基本解析器
在一个服务提供者内部,你总是可以通过 $this->app 实例变量来访问到容器。
在服务提供者里,总是通过 $this->app 实例变量使用容器。
服务容器注册依赖有几种方式,包括闭包回调和绑定实例的接口。首先,我们来探讨闭包回调的方式。被注册至容器的闭包解析器包含一个 key (通常用类名称) 和一个有返回值的闭包:
~~~
$this->app->bind('FooBar', function($app)
{
return new FooBar($app['SomethingElse']);
});
~~~
### 注册一个单例
有时候,你可能希望绑定到容器的对象只会被解析一次,之后的调用都返回相同的实例:
~~~
$this->app->singleton('FooBar', function($app)
{
return new FooBar($app['SomethingElse']);
});
~~~
### 绑定一个已经存在的实例
你也可以使用 instance 方法,绑定一个已经存在的实例到容器,接下来将总是返回该实例:
~~~
$fooBar = new FooBar(new SomethingElse);
$this->app->instance('FooBar', $fooBar);
~~~
## 解析
从容器解析出实例有几种方式。
一、可以使用 make 方法:
`$fooBar = $this->app->make('FooBar');`
二、你可以像「访问数组」一样对容器进行访问,因为它实现了PHP的 ArrayAccess 接口:
`$fooBar = $this->app['FooBar'];`
最后,也是最重要的一点,你可以在构造函数中简单地「类型指定(type-hint)」你所需要的依赖,包括在控制器、事件监听器、队列任务,过滤器等等之中。容器将自动注入你所需的所有依赖:
~~~
<?php namespace App\Http\Controllers;
use Illuminate\Routing\Controller;
use App\Users\Repository as UserRepository;
class UserController extends Controller {
/**
* The user repository instance.
*/
protected $users;
/**
* Create a new controller instance.
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
$this->users = $users;
}
/**
* Show the user with the given ID.
*
* @param int $id
* @return Response
*/
public function show($id)
{
//
}
}
~~~