我正在将 Symfony 集成到具有自己基于 PSR-11 的依赖容器的旧应用程序中。一直在寻找一种将 DI 容器合并到 Symfony 使用的解决方案,但一无所获。为了让它发挥作用,我提出了一个我不喜欢的“hacky”解决方案。
我已经创建了这个类。它在其中创建一个旧 DI 容器的实例:
class OldAppServiceFactory
{
private ContainerInterface $container;
public function __construct()
{
$this->container = OldContainerFactory::create();
}
public function factory(string $className)
{
return $this->container->get($className);
}
}
并将适当的条目添加到services.yaml
:
oldapp.service_factory:
class: Next\Service\LeonContainer\LeonServiceFactory
OldApp\Repository\Repository1:
factory: ['@oldapp.service_factory', 'factory']
arguments:
- 'OldApp\Repository\Repository1'
OldApp\Repository\Repository2:
factory: ['@oldapp.service_factory', 'factory']
arguments:
- 'OldApp\Repository\Repository2'
OldApp\configuration\ConfigurationProviderInterface:
factory: ['@oldapp.service_factory', 'factory']
arguments:
- 'OldApp\configuration\ConfigurationProviderInterface'
通过上述技巧,将这些类放在服务类构造函数中是可行的。不幸的是,它看起来很糟糕,用更多的存储库来扩展它会很痛苦(尤其是当有 50 个时)。是否有可能实现这样的目标services.yaml
?
OldApp\Repository\:
factory: ['@oldapp.service_factory', 'factory']
arguments:
- << PASS FQCN HERE >>
这将使我services.yaml
在旧应用程序的单个命名空间中只有一个条目。
但是,也许我的问题还有其他解决方案?一直在尝试配置Kernel.php
和prepareContainer(...)
方法,但我也一无所获,因为旧的依赖项位于一个返回数组的 PHP 文件中:
return array [
RepositoryMetadataCache::class => static fn () => RepositoryMetadataCache::createFromCacheFile(),
EntityCollection::class => autowire(EntityCollection::class),
'Model\Repository\*' => static function (ContainerInterface $container, RequestedEntry $entry) { ... }
];