olvlvl / symfony-dependency-injection-proxy
为Symfony的依赖注入生成超级小的代理
Requires
- php: >=8.1
- ext-json: *
- symfony/dependency-injection: ^6.3
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.3
- symfony/config: ^6.3
README
此包为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 持续测试。
行为准则
本项目遵守 贡献者行为准则。通过参与本项目及其社区,您应遵守此准则。
贡献
有关详细信息,请参阅 CONTRIBUTING。
许可协议
olvlvl/symfony-dependency-injection-proxy 采用 BSD-3-Clause 许可协议发布。