Application
应用容器
控制反转 (IoC) 容器是用于管理类依赖项的工具。依赖注入是一种去除硬编码类依赖的方法。相反,依赖项是在运行时注入的,允许更大的灵活性,因为依赖项实现可以很容易地交换。
将类型绑定到容器中
IoC 容器可以通过两种方式解决依赖关系:通过 Closure 回调或自动解决。首先,我们将探索 Closure 回调。首先,可以将“类型”绑定到容器中:
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);
将接口绑定到实现
在某些情况下,类可能依赖于接口实现,而不是“具体类型”。在这种情况下,App::bind
方法必须用于通知容器注入哪个接口实现:
App::bind('UserRepositoryInterface', 'DbUserRepository');
现在考虑以下代码:
$users = App::make('UserRepositoryInterface');
既然我们已经绑定了UserRepositoryInterface
对于具体类型,DbUserRepository
创建时将自动注入到此控制器中。
在哪里注册绑定
IoC 绑定,比如事件处理器,通常属于“引导代码”类别。换句话说,它们让您的应用程序准备好实际处理请求,并且通常需要在实际调用路由或控制器之前执行。最常见的地方是boot
一个方法插件注册文件.或者,插件可以提供一个名为init.php 在可用于放置 IoC 注册逻辑的插件目录中。
服务供应商
服务提供商是在单个位置创建库和执行组相关 IoC 注册的好方法。在服务提供商中,您可以注册自定义身份验证驱动程序,向 IoC 容器注册应用程序的存储库类,甚至设置自定义 Artisan 命令。
实际上,插件注册文件 继承服务提供者,大部分核心组件都包含服务提供者。您的应用程序的所有注册服务提供商都列在providers
的数组config/app.php
配置文件。
定义服务提供者
要创建服务提供者,只需扩展Winter\Storm\Support\ServiceProvider
分类并定义一个register
方法:
use Winter\Storm\Support\ServiceProvider;
class FooServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind('foo', function() {
return new Foo;
});
}
}
请注意,在register
方法,您可以通过以下方式使用应用程序 IoC 容器$this->app
财产。一旦你创建了一个提供者并准备好在你的应用程序中注册它,只需将它添加到providers
数组在你的app
配置文件。
在运行时注册服务提供者
您还可以在运行时使用App::register
方法:
App::register('FooServiceProvider');
应用事件
请求事件
您可以在请求被路由之前注册特殊事件before
和after
方法:
App::before(function ($request) {
// Code to execute before the request is routed
});
App::after(function ($request) {
// Code to execute after the request is routed
});
容器事件
服务容器在每次解析对象时都会触发一个事件。您可以使用resolving
方法:
App::resolving(function ($object, $app) {
// Called when container resolves object of any type...
});
App::resolving('foo', function ($fooBar, $app) {
// Called when container resolves objects using hint "foo"...
});
App::resolving('Acme\Blog\Classes\FooBar', function ($fooBar, $app) {
// Called when container resolves objects of type "FooBar"...
});
如您所见,正在解析的对象将传递给回调,允许您在将对象提供给其使用者之前在该对象上设置任何其他属性。
应用助手
寻找应用环境
您可以使用environment
方法来发现由确定的应用程序环境环境配置.
// production
App::environment();
确定执行上下文
可以使用runningInBackend
方法。
App::runningInBackend();
您也可以使用runningInConsole
检查执行代码是否发生在内部的方法命令行界面:
App::runningInConsole();