slince / di
灵活的依赖注入容器
3.2.3
2023-06-16 15:05 UTC
Requires
- php: >=7.4
- dflydev/dot-access-data: ^3.0
- psr/container: ^1.0 || ^2.0
Requires (Dev)
- phpunit/phpunit: ^7.5|^8.0|^9.0
README
此包是一个灵活的PHP IOC容器,注重轻量级、快速,并尽可能减少配置。它是PSR-11的一个实现
安装
通过Composer安装。
{ "require": { "slince/di": "^3.0" } }
或者,使用Composer CLI要求包
composer require slince/di ^3.0
使用
容器是依赖注入容器。它允许您实现依赖注入设计模式,这意味着您可以解耦类的依赖关系,并让容器在需要的地方注入它们。
namespace Acme; class Foo { /** * @var \Acme\Bar */ public $bar; /** * Construct. */ public function __construct(Bar $bar) { $this->bar = $bar; } } class Bar { public $foo; public $baz; public function __construct($foo, $baz) { $this->foo = $foo; $this->baz = $baz; } } $container = new Slince\Di\Container(); $container->register(Acme\Foo::class); $foo = $container->get(Acme\Foo::class); var_dump($foo instanceof Acme\Foo); // true var_dump($foo->bar instanceof Acme\Bar); // true
创建服务引用
$container->register('bar', Acme\Bar::class); $container->register('foo', Acme\Foo::class) ->addArgument(new Slince\Di\Reference('bar')); //refer to 'bar' var_dump($container->get('bar') === $container->get('foo')->bar)); // true
使用工厂创建服务
假设您有一个工厂,通过调用静态方法 createNewsletterManager()
配置并返回一个新的 NewsletterManager
对象。
class NewsletterManagerStaticFactory { public static function createNewsletterManager($parameter) { $newsletterManager = new NewsletterManager($parameter); // ... return $newsletterManager; } }
// call the static method $container->register( NewsletterManager::class, array(NewsletterManagerStaticFactory::class, 'createNewsletterManager') )->addArgument('foo');
如果您的工厂不是使用静态函数来配置和创建服务,而是使用常规方法,您也可以将工厂本身实例化为服务。
// call a method on the specified factory service $container->register(NewsletterManager::class, [ new Reference(NewsletterManagerFactory::class), 'createNewsletterManager' ]);
创建服务别名
$container->register(Acme\Foo::class); $container->setAlias('foo-alias', Acme\Foo::class); $foo = $container->get('foo-alias'); var_dump($foo instanceof Acme\Foo); // true
配置容器
- 单例
$container->setDefaults([ 'share' => false ]); $container->register('foo', Acme\Foo::class); var_dump($container->get('foo') === $container->get('foo')); // false
- 自动装配
$container->setDefaults([ 'autowire' => false, ]); $container->register('foo', Acme\Foo::class) ->addArgument(new Acme\Bar()); // You have to provide $bar var_dump($container->get('foo') instanceof Acme\Foo::class); // true
容器参数
$container->setParameters([ 'foo' => 'hello', 'bar' => [ 'baz' => 'world' ] ]); $container->register('bar', Acme\Bar::class) ->setArguments([ 'foo' => $container->getParameter('foo'), 'baz' => $container->getParameter('bar.baz') ]); $bar = $container->get('bar'); var_dump($bar->foo); // hello var_dump($bar->bar); // world
与服务标签一起工作
$container->register('foo')->addTag('my.tag', array('hello' => 'world')); $serviceIds = $container->findTaggedServiceIds('my.tag'); foreach ($serviceIds as $serviceId => $tags) { foreach ($tags as $tag) { echo $tag['hello']; } }
许可证
MIT许可证。查看 MIT