pianissimo-php / dependency-injection
依赖注入组件允许您实现依赖注入设计模式。
Requires
- psr/container: ^1.0
This package is auto-updated.
Last update: 2024-09-21 23:48:05 UTC
README
依赖注入组件允许您实现依赖注入设计模式。
安装
composer require pianissimo-php/dependency-injection:master-dev
什么是服务?
服务是一个可以作为类依赖注入的对象。服务存储在容器中。
定义服务
创建容器的最简单方法就是使用ContainerBuilder
。该ContainerBuilder
实现了ContainerInterface
。
$containerBuilder = new ContainerBuilder();
register()
方法允许您定义一个新的服务。它返回一个Definition
对象。您可以通过使用addArgument()
添加参数来描述MailerService
的构造函数。
$containerBuilder ->register('mailer_service', MailerService::class) ->addArgument(new Reference('entity_manager_interface')) ->addArgument('SMTP');
您还可以为服务定义启用自动注入。
$containerBuilder ->register('entity_manager', EntityManager::class) ->setAutowired(true);
您还可以使用autowire
方法自动注入服务。
$containerBuilder->autowire(EntityManager::class);
Builder
类将自动注入Definition
对象。
您还可以选择默认启用自动注入。
$containerBuilder->setDefaultAutowiring(true);
您还可以这样定义用于注入接口的服务
$containerBuilder->add(EntityManagerInterface::class, new Reference('entity_manager'));
使用addTag()
方法向您的服务定义添加标签
$containerBuilder ->register('dashboard_controller', DashboardController::class) ->addTag('controller') ->setAutowired(true);
在容器构建完成后,您可以使用findServicesByTag()
方法检索标记过的服务定义(例如,用于编译器传递)。
$containerBuilder->findServicesByTag('controller');
构建容器
使用build
方法构建容器
$containerBuilder->build();
Builder
类构建所有定义,并自动注入所有启用了自动注入的定义。
编译器传递
您可以将编译器传递添加到容器中,这些将在所有定义构建完成后处理。编译器传递必须实现CompilerPassInterface
。
$containerBuilder->addCompilerPass($compilerPass);
从容器中获取服务
当容器构建完成后,您可以通过以下方式从容器中获取服务
$mailerService = $containerBuilder->get('mailer_service');
容器在初始化时加载服务,否则将使用其构建的定义初始化服务。
避免使用get()
方法,您应该通过构造函数获取依赖。如果您使用MVC模式,您应该在控制器解析器中使用get()
方法来定义您的控制器作为服务。
注入容器
依赖注入组件不允许您注入服务容器。您的服务不应有容器意识,它们不需要知道它们是如何以及何时被注入的。了解更多