【发布时间】:2020-07-08 21:00:32
【问题描述】:
我有一个遗留应用程序,它建立在一个旧的自定义 MVC 框架上,我希望最终摆脱它。这个框架不依赖单一的前端控制器,所以大部分页面还是有专门的php文件来调用尊敬的控制器,其他的都是php/html混合的。我已经阅读了有关使用各种方法 (https://symfony.com/doc/current/migration.html) 将应用程序迁移到 symfony 的文章,但是我对这两种方法都遇到了问题,并且意识到我真的不需要 symfony 的路由处理。
Symfony 当前存在于我们的应用程序中,但仅由各种命令使用。我们所有的核心逻辑仍在遗留应用程序中,因此 Symfony 可以毫无问题地访问它,因为类都在全局命名空间中。然而,问题是,遗留应用程序不能使用任何新的 Symfony 类,因为它不支持依赖注入。为了开始将我们的一些核心逻辑和功能转移到 Symfony,需要这种能力。
理想情况下,我希望能够将容器加载到我们的旧应用程序中,该应用程序提供了我们所有的自动装配服务。允许我在旧版应用程序中访问基于 Symfony 的新服务。
非常感谢任何帮助。
非常感谢。
更新 1
所以我尝试了@Cerad 所说的,只需访问内核,因为它是全局的。我将 bootstrap.php 逻辑复制到我的旧应用程序的主配置中(因此它会加载现有的 .env* 文件),然后启动内核(实例化它并在我的旧配置中调用 boot)。它有效,我可以在我的 php 文件中引用 $kernel(使用全局 $kernel)并访问容器。但是,这与@Dmitry Solovov 的回复一致,服务必须是公开的。
我必须将我想要的所有服务设置为公开吗?如果我在 services.yaml 中手动定义服务,将其设置为 public,它就可以工作。
但这并不理想,因为我想自动加载我的服务,因此我可以正确使用服务,而不必明确定义我希望在旧版应用中可用的每个服务。
如何在不公开服务的情况下将服务注入旧版控制器?就像 Symfony 的控制器如何允许您将服务注入到控制器方法中一样?
非常感谢。
【问题讨论】:
-
容器可以通过 $kernel 访问,而 $kernel 又是一个全局变量。这是你要求的吗?
-
服务必须是公开的,实际上没有办法将非公开服务注入您的应用程序控制器。我用一个示例编辑了我的答案,以公开所有服务。
-
用一个简单的例子开始一个新问题可能会更好。起初你说你的遗留类不支持注入,然后,通过你的编辑,你说你的遗留控制器支持。然后在最后一句话中,您询问注入控制器方法,这是一个完全不同的主题,而不是容器本身所做的事情。术语很重要。有一个 Reddit Symfony 论坛可能是解决这类问题的更好平台。
-
很抱歉给您带来了困惑。起初他们没有,但是您对仅使用 $kernel 的评论使我仅在我的主配置中加载内核。那时我能够访问所有公共服务。谢谢你的帮助,你让我走上了正确的道路。