如何使用的Symfony 2容器中的遗留应用程序(How to use the Symfony 2

2019-07-29 00:16发布

想遗留应用程序与Symfony的2应用程序集成 - 取代旧的应用程序与Symfony的成分越来越多的零部件。 我会采取的方法在传统的应用程序使用的Symfony 2容器获得已配置的Symfony的2应用程序的服务。 我想使用的第一个服务是会话和安全环境。

问题:

  • 这是可行的?
  • 我怎么配置的服务容器?

在传统的应用程序更多信息:典型的PHP烂摊子:单PHP文件,如“控制器”(检查$ _GET和不同的执行路径$ _ POST)。 每个页面包含init.php哪些数据库对象的设置自动加载,数据库连接等会话管理有其自己的类(我想更换),该数据是通过调用静态方法检索(!)。

Answer 1:

使用的Symfony的DIC作为一个独立的组件,可以 ,但你必须做很多事情“手动”(如你不使用全Symfony框架从一开始就计划)。 你可能不会得到太多的使用DIC与所有传统的东西。

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

作为@Cerad建议你可以在包裹你的Symfony的遗留代码。 看看IngewikkeldWrapperBundle束。 你不能把它当作是,但它可能给你一些想法。

还有第三条道路。

你可以决定实现在Symfony的应用程序的每个新功能。 比,可以使这两个传统和Symfony的应用程式并存。 在服务器级别(即Nginx的),你可能会代理传统的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);


Answer 2:

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

$kernel = new AppKernel('prod', true);
$kernel->loadClassCache();
$kernel->boot();
$request = Request::createFromGlobals();
$container = $kernel->getContainer();
$sc = $container->get('security.context');


文章来源: How to use the Symfony 2 Container in a legacy app