2012-04-16 38 views
7

想要將傳統應用程序與Symfony 2應用程序集成 - 用Symfony組件替換舊應用程序中越來越多的部分。我會採用的方法是在傳統應用程序中使用Symfony 2容器,獲取已經爲Symfony 2應用程序配置的服務。我想要使​​用的第一個服務是會話和安全上下文。如何在傳統應用程序中使用Symfony 2容器

問題:

  • 這是可行的?
  • 如何獲取配置的服務容器?

的遺留應用程序更多信息:典型的PHP爛攤子:單PHP文件,如「控制器」(檢查$ _GET和不同的執行路徑$ _ POST)。每個頁面包括設置自動加載,數據庫連接等的init.php。會話管理有它自己的類(我想替換它),通過調用數據庫對象的靜態方法(!)來檢索數據。

+0

我不能說是否有可能或不...當然是,但它是值得的?要實現服務容器,考慮到你必須實現Symfony2內核,這是框架的核心。 – AlterPHP 2012-04-16 08:50:10

+0

如果沒有任何有關舊版應用程序結構的信息,就不可能回答這個問題,除非說它可能不適用於沒有重寫的非OOP代碼。 – GordonM 2012-04-16 09:09:22

+1

我做了這樣的事情。我用普通的S2來實現S2控制器的動作。然後從控制器中調用我的遺留初始化代碼,然後將其稱爲控制器。非常黑客,但它工作正常。我不認爲你會得到一個正確配置的S2會話對象沒有這樣做的運氣很多。 – Cerad 2012-04-16 12:55:16

回答

10

使用Symfony的DIC作爲獨立組件is possible,但您必須手動執行許多操作(因爲您從一開始就不打算使用完整的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); 
1

我相信你可以從你的遺留應用程序訪問容器實例這樣

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

是的,這是有效的。我添加了一行調用初始化容器的「boot」方法。不過,我仍然不能使用security.context,因爲它嚴重依賴於symfony MVC設置。 – chiborg 2012-04-17 13:36:02

+0

您可以像這樣訪問安全上下文$ container-> get('security.context') – Sethunath 2012-04-17 13:42:43

+0

是的,但我試圖調用'getToken'或'isGranted'並得到'AuthenticationCredentialsNotFoundException'。所以我假設使用安全上下文只會在您初始化您的請求對象並使用Symfony進行路由時才起作用 - 目前我無法做到這一點。 – chiborg 2012-04-17 14:34:38

相關問題