php - 如何在遗留应用程序中使用 Symfony 2 容器

标签 php dependency-injection symfony legacy-code

想要将遗留应用程序与 Symfony 2 应用程序集成 - 用 Symfony 组件替换旧应用程序的越来越多的部分。我将采用的方法是在遗留应用程序中使用 Symfony 2 容器获取已为 Symfony 2 应用程序配置的服务。我想使用的第一个服务是 session 和安全上下文。

问题:

  • 这可行吗?
  • 如何获取配置的服务容器?

遗留应用程序中的更多信息:典型的 PHP 困惑:单个 PHP 文件,作为“ Controller ”(检查 $_GET 和 $_POST 以获取不同的执行路径)。每个页面都包含 init.php,它设置自动加载、数据库连接等。 session 管理有自己的类(我想替换它),通过调用静态方法检索数据(!)数据库对象。

最佳答案

将 Symfony 的 DIC 用作独立组件 is possible但是你必须“手动”做很多事情(因为你不打算从一开始就使用完整的 Symfony 框架)。您可能不会将 DIC 与所有那些遗留的东西一起使用。

如果你想走这条路,我会考虑先选择另一个组件(比如 HttpFoundation 和 HttpKernel)。

正如@Cerad 建议的那样,您可以将遗留代码包装在 Symfony 中。看看IngewikkeldWrapperBundle捆。您不能按原样使用它,但它可能会给您一些想法。

还有第三种方式。

您可以决定在 Symfony 应用程序中实现每个新功能。然后,您可以让遗留应用程序和 Symfony 应用程序共存。在服务器级别(即 Nginx),您可以将旧版 URL 代理到旧版应用程序,并将所有迁移的 URL 代理到 Symfony2 应用程序。在我的例子中,这种情况是最好的选择并且被证明是有效的。但是,我们 promise 放弃遗留应用程序开发(因此每个新功能或更改都必须在 Symfony2 应用程序中开发)。

编辑:以下是如何在遗留应用程序中启动 Symfony 内核并分派(dispatch)事件(防火墙需要):

$kernel = new \AppKernel('dev', true);
$kernel->boot();

$request = Request::createFromGlobals();
$request->attributes->set('is_legacy', true);
$request->server->set('SCRIPT_FILENAME', 'app.php');

$container = $kernel->getContainer();
$container->enterScope('request');
$container->get('request_stack')->push($request);
$container->set('request', $request);

$event = new GetResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST);
$eventDispatcher = $container->get('event_dispatcher');
$eventDispatcher->dispatch('kernel.request', $event);

关于php - 如何在遗留应用程序中使用 Symfony 2 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10170989/

相关文章:

javascript - AngularJS - 在一个简单的应用程序上获取 "Uncaught Error: [$injector:modulerr]"消息

php - ob_get_contents 在 Php 中如何工作?

PHP倒计时日期

php - 将数据库中的文本密码转换为散列密码?

Angular 注入(inject) token ; 'app.config'是什么?

php - Doctrine——选择所有字段并按其中一个分组

php - 大文件上传时出现 aw snap 错误

java - 将系统作为依赖项处理

php - 有了学说,我无法获得 Postgres 的正确序列名称

php - 如何根据 symfony 2 中的角色重定向到不同的 url