如何在遗留应用程序中使用Symfony 2 Container

chi*_*org 8 php dependency-injection legacy-code symfony

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

问题:

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

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

Jak*_*las 11

使用Symfony的DIC作为独立组件是可能的,但您必须"手动"执行许多操作(因为您不打算从一开始就使用完整的Symfony Framework).你可能不会在所有遗留的东西上使用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);
Run Code Online (Sandbox Code Playgroud)