🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 绑定 几乎你所有服务容器将与已注册的服务提供者绑定,这些例子都在情境(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) { // } } ~~~ ~~~