Хотелось бы интегрировать устаревшее приложение с приложением Symfony 2 – заменяя все больше и больше частей старого приложения компонентами Symfony. Подход, который я хотел бы использовать, заключается в использовании контейнера Symfony 2 в унаследованном приложении, который получает службы, которые уже настроены для приложения Symfony 2. Первыми услугами, которые я хотел бы использовать, являются сеанс и контекст безопасности.
Вопросов:
Дополнительная информация в устаревшем приложении: типичный беспорядок PHP: отдельные файлы PHP, как «контроллеры» (проверка $ _GET и $ _POST для разных путей выполнения). Каждая страница включает init.php
который устанавливает автозагрузку, соединение с базой данных и т. Д. Управление сеансом имеет свой собственный класс (который я бы хотел заменить), данные извлекаются через вызовы статическим методам (!) Объектов базы данных.
Использование DIC от Symfony в качестве автономного компонента возможно, но вам придется делать много вещей «вручную» (поскольку вы не планируете использовать полную 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);
Я считаю, что вы можете получить доступ к экземпляру контейнера из вашего устаревшего приложения, как это
$kernel = new AppKernel('prod', true); $kernel->loadClassCache(); $kernel->boot(); $request = Request::createFromGlobals(); $container = $kernel->getContainer(); $sc = $container->get('security.context');