olvlvl/

symfony-dependency-injection-proxy

为Symfony的依赖注入生成超级小的代理

v5.0.0 2023-09-10 09:46 UTC

This package is auto-updated.

Last update: 2024-09-20 14:29:58 UTC


README

Release Packagist Code Quality Code Coverage

此包为Symfony依赖注入组件提供了一个代理生成器,生成超级小、超级简单的代理,尤其是与Symfony的默认实现相比。以下是一些差异:

  • 可以代理 final 类。
  • 只能代理具有接口的类。
  • 生成的代理是自包含的。
  • 包大小约为10Kb,没有依赖。
  • 一旦生成代理,就可以删除此包。

如果您不熟悉代理服务,请在继续之前先查看 Symfony的文档

安装

composer require olvlvl/symfony-dependency-injection-proxy

工作原理

生成器基于以下假设:我们要代理的服务实现了一个接口,使用该服务的服务期望该接口,遵循 依赖倒置原则。现在,考虑以下代码,其中 ExceptionHandler 服务需要一个实现 LoggerInterface 的日志记录器

<?php

use Psr\Log\LoggerInterface;

class ExceptionHandler
{
    public function __construct(private LoggerInterface $logger)
    {
    }

    // …
}

假设我们使用 Monolog 作为日志记录器,并有一个庞大的流需要设置。为什么要在每次请求时都浪费时间构建日志记录器,而它很少使用呢?这就是我们标记服务为 懒加载 的原因。

以下示例演示了如何将我们的 Psr\Log\LoggerInterface 服务标记为懒加载(我们同样可以使用PHP代码或XML)

services:
  Psr\Log\LoggerInterface:
    class: Monolog\Logger
    lazy: true
    #

服务还可以使用工厂

services:
  Psr\Log\LoggerInterface:
    factory: 'LoggerFactory::build'
    lazy: true
    #

注意:我们不需要用类定义我们的服务,我们可以用 logger 替代 Psr\Log\LoggerInterface,同样,除了工厂类必须定义 class 外。

现在让我们看看如何构建我们的容器。

构建依赖注入容器

以下代码演示了如何构建、编译和导出容器

<?php

use olvlvl\SymfonyDependencyInjectionProxy\ProxyDumper;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;

$builder = new ContainerBuilder();

// …
// Here we load our config, or build the container using clever PHP calls.
// We might even have some compiler passes to add.
// …

$builder->compile();

$dumper = new PhpDumper($builder);
$dumper->setProxyDumper(new ProxyDumper());

/* @var string $containerFile */

file_put_contents($containerFile, $dumper->dump());

就是这样。我们可以像往常一样使用我们的容器,一切都很棒。

如果我的懒加载服务实现了多个接口怎么办?

如果服务实现了许多接口,基本接口解析器很难确定要实现哪个接口。例如,如果服务是一个 ArrayObject 的实例,以下异常将被抛出

Don't know which interface to choose from for ArrayObject: IteratorAggregate, Traversable, ArrayAccess, Serializable, Countable.

我们可以使用 lazy 属性指定要实现的接口

ArrayObject:
  lazy: ArrayAccess

持续集成

该项目由 GitHub actions 持续测试。

Tests Static Analysis Code Style

行为准则

本项目遵守 贡献者行为准则。通过参与本项目及其社区,您应遵守此准则。

贡献

有关详细信息,请参阅 CONTRIBUTING

许可协议

olvlvl/symfony-dependency-injection-proxy 采用 BSD-3-Clause 许可协议发布。