gpt4 book ai didi

php - 将 Symfony 的依赖注入(inject)( Autowiring )集成到遗留应用程序中

转载 作者:行者123 更新时间:2023-12-04 14:13:03 25 4
gpt4 key购买 nike

我有一个遗留应用程序,它建立在一个旧的自定义 MVC 框架之上,我想最终摆脱它。这个框架不依赖于单一的前端 Controller ,所以大多数页面仍然有专门的 php 文件来调用受尊重的 Controller ,其他的则是混合 php/html。我已经阅读了有关使用各种方法 ( https://symfony.com/doc/current/migration.html ) 将应用程序迁移到 symfony 的文章,但是我对这两种方法都遇到了问题,并且意识到我并不真的需要 symfony 的路由处理。

Symfony 目前存在于我们的应用程序中,但仅供各种命令使用。我们所有的核心逻辑仍在遗留应用程序中,因此 Symfony 可以毫无问题地访问它,因为类都在全局命名空间中。然而,问题在于,遗留应用程序无法使用任何新的 Symfony 类,因为它不支持依赖注入(inject)。为了开始将我们的一些核心逻辑和功能转移到 Symfony,需要这种能力。

理想情况下,我希望能够完成的是将容器加载到我们的遗留应用程序中,该应用程序具有我们所有可用的 Autowiring 服务。允许我在我们的遗留应用程序中访问我们新的基于 Symfony 的服务。

非常感谢任何帮助。

非常感谢。

更新 1

所以我尝试了@Cerad 所说的,只需访问内核,因为它是全局的。我将 bootstrap.php 逻辑复制到我的遗留应用程序的主配置(因此它加载现有的 .env* 文件),然后启动内核(实例化它并在我的遗留配置中调用引导)。它有效,我可以在我的 php 文件中引用 $kernel(使用全局 $kernel)并访问容器。然而,这与@Dmitry Solovov 的回应一致,服务必须是公开的。

我必须将我想要的所有服务设置为公开吗?如果我在 services.yaml 中手动定义服务,将其设置为公共(public),它就可以工作。

但这并不是很理想,因为我想自动加载我的服务,所以我可以以正确的方式使用服务,而不必明确定义我希望在我的旧版应用程序中可用的每项服务。

如何在不公开服务的情况下将服务注入(inject)到我的遗留 Controller 中?就像 Symfony 的 Controller 如何允许您将服务注入(inject) Controller 方法一样?

非常感谢。

最佳答案

独立使用依赖注入(inject):

  • 安装包:
composer require symfony/dependency-injection
  • 在配置文件中定义您的服务(即 src/Resources/config/services.yaml)。示例:
services:
_defaults:
autowire: true
autoconfigure: true
public: false

App\Services\MyService:
class: App\Services\MyService
public: true

您还可以使用服务自动导入功能 https://symfony.com/doc/current/service_container.html#importing-many-services-at-once-with-resource

  • 使用以下代码编译 DI 容器:
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;

$container = new ContainerBuilder();
$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/src/Resources/config'));
$loader->load('services.yaml');
$container->compile();
  • 将此容器实例注入(inject)您的应用程序。或者扩展 ContanerBuilder 类并使其成为单例。

在你的应用程序中使用的服务应该是公共(public)的,这样你就可以直接从容器中获取它们:

$service = $container->get(\App\Services\MyService::class);

您还可以默认公开您的所有服务:

services:
_defaults:
public: true

关于php - 将 Symfony 的依赖注入(inject)( Autowiring )集成到遗留应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62803567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com