pianissimo-php/dependency-injection

依赖注入组件允许您实现依赖注入设计模式。

dev-master 2019-08-21 11:42 UTC

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()方法来定义您的控制器作为服务。

注入容器

依赖注入组件不允许您注入服务容器。您的服务不应有容器意识,它们不需要知道它们是如何以及何时被注入的。了解更多