marcelomx/micro-container

一个轻量级的PHP依赖注入容器

1.0.0-beta 2024-05-15 13:13 UTC

This package is auto-updated.

Last update: 2024-09-17 13:07:21 UTC


README

Micro Container是一个轻量级的PHP依赖注入容器,旨在简化您PHP应用程序中依赖项的管理。使用Micro Container,您可以使用简洁直观的语法轻松定义和解决依赖项。

安装

要安装Micro Container,请使用Composer

composer require marcelomx/micro-container

用法

基本设置

首先创建一个ServiceContainer类的实例,并为其提供一个包含依赖定义的数组

use MicroContainer\ServiceContainer;

$container = new ServiceContainer([
    Foo::class => fn() => new Foo('foo', new \stdClass),
    Bar::class => Bar::class,
    'foo.alias' => Foo::class,
    FooInterface::class => Foo::class
]);

以下是定义的分解

  • 可调用工厂(Foo::class):使用可调用工厂函数定义Foo类的实例化,允许自定义初始化。

  • 类字符串自动注入(Bar::class):展示Bar类的类字符串自动注入解决方法,Micro Container自动解决依赖。

  • 服务别名('foo.alias'):创建Foo类的别名,以展示容器中服务别名的使用。

  • 接口解析(FooInterface::class):解析接口(FooInterface)到其实例(Foo)。

检索服务

一旦容器设置完毕,您可以轻松检索已定义服务的实例

$foo = $container->get(Foo::class);
assert($foo instanceof Foo);

$aliasFoo = $container->get('foo.alias');
assert($aliasFoo === $foo);

$bar = $container->get(Bar::class);
assert($bar instanceof Bar);
assert($bar->foo === $foo);

$service = $container->get(FooInterface::class);
assert($service instanceof FooInterface);
assert($service === $foo);

自动注入

Micro Container支持非定义服务的自动注入。以下示例中,Baz类是在容器中未显式定义的情况下创建的

$baz = $container->get(Baz::class);
assert($baz instanceof Baz);
assert($baz->bar === $bar);

这展示了Micro Container自动解决依赖的能力,使其方便地处理未在容器中显式定义的类。

此外,您可以使用Autowired属性自动将依赖注入到您的类属性中

use MicroContainer\Attributes\Autowired;

class MyClass {
    #[Autowired()]
    private FooInterface $foo;

    #[Autowired(service: Bar::class)]
    private $bar;
}

在此示例中,Autowired属性被用于指示$foo属性应自动注入FooInterface的一个实例,而$bar属性应注入Bar类的一个实例。这为在类中表达依赖提供了一个简洁的声明性方法,提高了可读性并减少了样板代码。

请随意自定义和扩展此基本设置以满足您项目的特定要求。

版权

Micro Container是开源软件,在MIT许可下发布。

贡献

我们欢迎贡献!要为Micro Container做出贡献,请遵循我们的贡献指南。您的帮助非常受欢迎。