8

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

问题:

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

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

4

2 回答 2

11

使用 Symfony 的 DIC 作为独立组件是可能的,但是您必须“手动”做很多事情(因为您从一开始就没有计划使用完整的 Symfony 框架)。您可能不会对使用 DIC 和所有那些遗留的东西有太多好处。

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

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

还有第三种方式。

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

编辑:这是在旧版应用程序中启动 Symfony 内核并调度事件(防火墙需要)的方法:

$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);
于 2012-04-16T17:45:36.063 回答
3

我相信您可以像这样从遗留应用程序访问容器实例

$kernel = new AppKernel('prod', true);
$kernel->loadClassCache();
$kernel->boot();
$request = Request::createFromGlobals();
$container = $kernel->getContainer();
$sc = $container->get('security.context');
于 2012-04-17T12:45:35.920 回答