应用

应用容器

控制反转(IoC)容器是用于管理类依赖性的工具。 依赖注入是一种删除硬编码类依赖关系的方法。 相反,依赖项是在运行时注入的,因为可以轻松地交换依赖项实现,从而实现更大的灵活性。

将类型绑定到容器中

IoC容器有两种方法可以解决依赖关系:通过Closure回调或自动解决。 首先,我们将探讨Closure回调。 首先,可以将“类型”绑定到容器中:

  1. App::bind('foo', function($app) {
  2. return new FooBar;
  3. });

解决容器中的类型

  1. $value = App::make('foo');

当调用App::make方法时,执行Closure回调并返回结果。

将“共享”类型绑定到容器中

有时您可能希望将某些内容绑定到仅应解析一次的容器中,并且在后续调用容器时应返回相同的实例:

  1. App::singleton('foo', function() {
  2. return new FooBar;
  3. });

将现有实例绑定到容器中

您还可以使用instance方法将现有对象实例绑定到容器中:

  1. $foo = new Foo;
  2. App::instance('foo', $foo);

将接口绑定到实现类

在某些情况下,类可能依赖于接口实现,而不是“具体类型”。 在这种情况下,必须使用App::bind方法来通知容器注入哪个接口实现:

  1. App::bind('UserRepositoryInterface', 'DbUserRepository');

现在考虑以下代码:

  1. $users = App::make('UserRepositoryInterface');

由于我们已将UserRepositoryInterface绑定到具体类型,因此DbUserRepository将在创建时自动注入此控制器。

在哪里注册绑定

IoC绑定,如事件处理程序,通常属于“引导代码(bootstrap code)”类别。 换句话说,它们准备应用程序以实际处理请求,并且通常需要在实际调用路由或控制器之前执行。 最常见的地方是插件注册文件.的boot方法。 或者,插件可以在插件目录中提供名为init.php的文件,您可以使用该文件放置IoC注册逻辑。

服务提供者

服务提供者是在单个位置创建库和执行与组相关的IoC注册的好方法。 在服务提供程序中,您可以注册自定义身份验证驱动程序,使用IoC容器注册应用程序的存储库类,甚至可以设置自定义Artisan命令。

实际上,插件注册文件继承了服务提供者,而大多数核心组件都包含服务提供者。 您的应用程序的所有注册服务提供程序都列在config/app.php配置文件的providers数组中。

定义服务提供者

要创建服务提供者,只需扩展October\Rain\Support\ServiceProvider类并定义register方法:

  1. use October\Rain\Support\ServiceProvider;
  2. class FooServiceProvider extends ServiceProvider
  3. {
  4. public function register()
  5. {
  6. $this->app->bind('foo', function() {
  7. return new Foo;
  8. });
  9. }
  10. }

请注意,在register方法中,可以通过$this-> app属性使用应用程序IoC容器。 一旦您创建了一个提供程序并准备将其注册到您的应用程序,只需将其添加到app配置文件中的providers数组即可。

在运行时注册服务提供商

您也可以使用App::register方法在运行时注册服务提供者:

  1. App::register('FooServiceProvider');

应用事件

请求事件

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

  1. App::before(function ($request) {
  2. // 在路由请求之前执行的代码
  3. });
  4. App::after(function ($request) {
  5. // 请求路由后执行的代码
  6. });

容器事件

每次解析对象时,服务容器都会触发一个事件。 你可以使用resolving方法听这个事件:

  1. App::resolving(function ($object, $app) {
  2. // 当容器解析任何类型的对象时调用...
  3. });
  4. App::resolving('foo', function ($fooBar, $app) {
  5. // 当容器使用提示“foo”解析对象时调用...
  6. });
  7. App::resolving('Acme\Blog\Classes\FooBar', function ($fooBar, $app) {
  8. // 当容器解析“FooBar”类型的对象时调用...
  9. });

如您所见,正在解析的对象将被传递给回调,允许您在将对象提供给其使用者之前设置该对象的任何其他属性。

应用帮助

查找应用程序环境

您可以使用environment方法来寻找由environment configuration确定的应用程序环境。

  1. // production
  2. App::environment();

确定执行上下文

可以使用runningInBackend方法了解当前请求是否在管理后端区域中执行。

  1. App::runningInBackend();

您还可以使用runningInConsole方法检查执行代码是否在命令行界面中进行:

  1. App::runningInConsole();