dastur/capsule

依赖注入容器。

v1.0.0 2017-06-16 04:28 UTC

This package is not auto-updated.

Last update: 2024-09-29 03:47:05 UTC


README

Capsule 是一个 PHP 依赖注入容器。它允许您将实例绑定到容器中,以便在需要时检索它们。如果您想确保没有依赖项被隐藏,可以使用此包提供的自动依赖注入。

目录

安装

Composer

从您的项目基础目录运行以下命令

composer require dastur\dastur

用法

要开始使用 capsule,请创建一个新的 Capsule 实例。

$capsule = new Capsule();

绑定

要将类绑定到容器,请使用 bind 方法

$capsule->bind(string $name, mixed $path, callable $value, boolean $singleton = false)

$name 参数是绑定的别名。$path 参数是一个类常量或字符串(包含完整的命名空间)。当 Capsule 需要解析类的依赖项时,会使用它。$value 参数是返回您所绑定服务的可调用对象。$singleton 参数是指定实例是否只解析一次。

示例

$capsule->bind('service', Service::class, function() {
  return new Service();
});

默认情况下,Capsule 每次从容器中获取某物时都会创建一个新的实例。如果您想只解析一次,请使用 singleton() 方法。

$capsule->singleton('service', Service::class, function() {
  return new Service();
});

解析

当您需要从容器中获取实例时,请使用 get 方法

$capsule->get(mixed $name)

$name 参数是正在解析的类的名称或类常量。此方法只会解析存储在 Capsule 中的类。

示例

$capsule->get('service') or $capsule->get(Service::class)

或者,您可以使用以下语法

$capsule->service or $capsule['service']

如果您需要创建一个未绑定在容器中的类,请使用 make 方法。

$capsule->make(mixed $path, array $parameters = [])

$path 是您正在解析的类的类常量。您也可以使用字符串作为此参数,但请确保其格式正确,否则会抛出错误。$parameters 参数是您要定义的覆盖数组。

例如

假设您有一个名为 Service 的类,它依赖于 AnotherService,并且其构造函数需要一个随机字符串。

<?php
namespace Package\Service

class Service
{
  public $anotherService;
  public $string;
  
  public function __construct(AnotherService $anotherService, $string)
  {
    $this->anotherService = $anotherService;
    $this->string = $string;
  }
}

现在,使用 make 方法,Capsule 可以为您解析此服务。

$service = $capsule->make(\Package\Service::class, ['string' => 'randomString')

现在,如果您尝试访问 $string$anotherService 属性,它们将分别返回 randomString 和 AnotherService 实例。

这对于在容器中绑定了一些重要的单例(例如 Router、Logger 等)特别有用。Capsule 可以为您解析这些参数。

示例

<?php
namespace Package\Service

class Service
{
  public $router;
  public $logger;
  
  public function __construct(Router $router, Logger $logger)
  {
    $this->router = $router;
    $this->logger = $logger;
  }
}
$capsule->make(\Package\Service::class)

使用制作进行绑定(解析)

如果有类,并且您想在不进行任何配置的情况下将其绑定到框架中,您可以这样做

$capsule->bind('service', Service::class)

如果 Capsule 看到这,它将使用 make 方法将 Service 绑定到容器中。这相当于执行以下操作

$capsule->bind('service', Service::class, function($capsule) {
  return $capsule->make(Service::class);
});

如果您需要指定覆盖项,您可以指定第三个参数。

$capsule->bind('service', Service::class, ['string' => 'random'])

销毁

如果您需要销毁容器中的实例,可以使用 destroy 方法。

$capsule->destroy(mixed $name)

示例

$capsule->destroy('service') or $capsule->destroy(Service::class)

或者,您也可以使用以下语法

unset($capsule->service) or unset($capsule['service'])

贡献

此存储库接受贡献。查看 贡献指南

许可证

MIT © Dastur1970