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');

应用事件

请求事件

您可以在请求被路由之前注册特殊事件beforeafter 方法:

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();
豫ICP备18041297号-2