2012-04-16 2 views
7

Хотелось бы интегрировать устаревшее приложение с приложением Symfony 2 - заменяя все больше и больше частей старого приложения компонентами Symfony. Подход, который я хотел бы использовать, заключается в использовании контейнера Symfony 2 в унаследованном приложении, который получает службы, которые уже настроены для приложения Symfony 2. Первыми услугами, которые я хотел бы использовать, являются сеанс и контекст безопасности.Как использовать контейнер Symfony 2 в устаревшем приложении

Вопросы:

  • Является ли это возможно?
  • Как получить сконфигурированный контейнер службы?

Дополнительная информация в унаследованном приложении: типичный беспорядок PHP: отдельные файлы PHP, как «контроллеры» (проверка $ _GET и $ _POST для разных путей выполнения). Каждая страница включает в себя init.php, которая устанавливает автозагрузку, подключение к базе данных и т. Д. Управление сеансом имеет свой собственный класс (который я бы хотел заменить), данные извлекаются через вызовы статическим методам (!) Объектов базы данных.

+0

Я не могу сказать, возможно ли это или нет ... Конечно, это так, но стоит ли это? Чтобы реализовать контейнер службы, примите во внимание, что вам нужно будет реализовать ядро ​​Symfony2, то есть ядро ​​структуры. – AlterPHP

+0

Без какой-либо информации о структуре устаревшего приложения ответить на этот вопрос невозможно, за исключением того, что, возможно, это невозможно для кода без OOP без серьезной перезаписи. – GordonM

+1

Я сделал что-то вроде этого. Я использовал обычный S2, чтобы перейти к действию контроллера S2. С контроллера я тогда назвал свой старый код инициализации, а затем назвал его контроллерами. Очень хак, но все получилось хорошо. Я не думаю, что вам удастся получить правильно настроенный объект сеанса S2, не делая ничего подобного. – Cerad

ответ

10

Использование DIC для Symfony как автономного компонента is possible, но вам придется делать много вещей «вручную» (поскольку вы не планируете использовать полную Symfony Framework с самого начала). Вероятно, вы вряд ли сможете использовать DIC со всем этим наследием.

Если вы хотите пойти по этому пути, я бы предпочел сначала выбрать другой компонент (например, HttpFoundation и HttpKernel).

Как @Cerad предложил, чтобы вы могли обернуть свой унаследованный код в Symfony. Посмотрите на IngewikkeldWrapperBundle комплект. Вы не можете использовать его, как есть, но это может дать вам некоторые идеи.

Существует третий способ.

Вы можете решить реализовать каждую новую функцию в приложении Symfony. Тогда вы можете сделать так, чтобы оба приложения и приложения Symfony сосуществовали. На уровне сервера (т. Е. Nginx) вы можете проксировать устаревшие URL-адреса для устаревшего приложения и всех перенесенных URL-адресов в приложение Symfony2. В моем случае этот сценарий был лучшим вариантом и оказался работоспособным. Тем не менее, мы стремились отказаться от разработки устаревших приложений (поэтому каждая новая функция или изменение должны были быть разработаны в приложении Symfony2).

Edit: вот как вы можете загрузить ядро ​​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

+0

Вы можете получить доступ к контексту безопасности, как этот $ container-> get ('security.context') – Sethunath

+0

Да, но я попытался вызвать 'getToken' или' isGranted' и получил «AuthenticationCredentialsNotFoundException». Поэтому я предполагаю, что использование контекста безопасности будет работать, только если вы инициализируете объекты запроса и маршрутизируете с помощью Symfony, чего я не могу в данный момент. – chiborg

Смежные вопросы