8

レガシーアプリケーションをSymfony2アプリケーションと統合したい-古いアプリケーションのますます多くの部分をSymfonyコンポーネントに置き換えたい。私が採用するアプローチは、レガシーアプリケーションでSymfony 2コンテナーを使用して、Symfony2アプリケーション用に既に構成されているサービスを取得することです。私が最初に使用したいサービスは、セッションとセキュリティコンテキストです。

質問:

  • これは実行可能ですか?
  • 構成されたサービスコンテナーを取得するにはどうすればよいですか?

レガシーアプリケーションの詳細:典型的なPHPの混乱:「コントローラー」としての単一のPHPファイル(異なる実行パスについて$_GETと$_POSTをチェック)。各ページにはinit.php、自動読み込み、データベース接続などを設定するものが含まれています。セッション管理には独自のクラス(置き換えたい)があり、データはデータベースオブジェクトの静的メソッド(!)の呼び出しを通じて取得されます。

4

2 に答える 2

11

スタンドアロンコンポーネントとしてSymfonyのDICを使用することは可能ですが、「手動で」多くのことを行う必要があります(最初から完全なSymfonyフレームワークを使用することを計画していないため)。おそらく、これらすべてのレガシーなものでDICを使用することはあまり得られないでしょう。

このパスを使用する場合は、最初に別のコンポーネント(HttpFoundationやHttpKernelなど)を選択することを検討します。

@Ceradが提案したように、レガシーコードをSymfonyでラップするかもしれません。IngewikkeldWrapperBundleバンドルをご覧ください。そのままでは使えませんが、アイデアが浮かぶかもしれません。

3番目の方法があります。

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 に答える