2012-04-16 10 views
7

Chciałbyś zintegrować starszą aplikację z aplikacją Symfony 2 - zastępując coraz więcej części starej aplikacji komponentami Symfony. Podejście, które bym podjął, to użycie kontenera Symfony 2 w starszej aplikacji, aby uzyskać usługi, które są już skonfigurowane dla aplikacji Symfony 2. Pierwsze usługi, których chciałbym użyć, to sesja i kontekst bezpieczeństwa.Jak korzystać z kontenera Symfony 2 w starszej aplikacji?

Pytania:

  • Czy to wykonalne?
  • Jak uzyskać skonfigurowany kontener usługi?

Więcej informacji w starszej aplikacji: Typowy błąd PHP: Pojedyncze pliki PHP, jako "kontrolery" (sprawdzanie $ _GET i $ _POST dla różnych ścieżek wykonania). Każda strona zawiera init.php, która ustawia automatyczne ładowanie, połączenie z bazą danych itp. Zarządzanie sesją ma swoją własną klasę (którą chciałbym zastąpić), dane są pobierane przez wywołania statycznych metod (!) Obiektów bazy danych.

+0

Nie mogę powiedzieć, czy to możliwe, czy nie ... Oczywiście, że jest, ale czy warto? Aby zaimplementować kontener usług, weź pod uwagę, że będziesz musiał zaimplementować jądro Symfony2, czyli rdzeń ramy. – AlterPHP

+0

Bez żadnych informacji na temat struktury starszej aplikacji nie można odpowiedzieć na to pytanie, z wyjątkiem tego, że prawdopodobnie nie jest możliwe użycie kodu innego niż OOP bez ważnego przepisania. – GordonM

+1

Zrobiłem coś takiego. Użyłem zwykłego S2, aby uzyskać działanie kontrolera S2. Z kontrolera nazwałam mój stary kod inicjacyjny, a następnie nazwałam go kontrolerami. Bardzo hack, ale wszystko działało dobrze. Nie sądzę, że będziesz miał dużo szczęścia, otrzymując poprawnie skonfigurowany obiekt sesji S2, nie robiąc czegoś takiego. – Cerad

Odpowiedz

10

Używanie DIC Symfony jako samodzielnego komponentu is possible, ale musisz zrobić wiele rzeczy "ręcznie" (ponieważ nie planujesz używać pełnego Symfony od samego początku). Prawdopodobnie nie dostaniesz dużo za pomocą DIC z tymi wszystkimi starymi rzeczami.

Jeśli chcesz pójść tą ścieżką, najpierw wybrałbym inny komponent (jak HttpFoundation i HttpKernel).

As @Cerad zasugerował, że możesz opakować swój starszy kod w Symfony. Spójrz na pakiet IngewikkeldWrapperBundle. Nie możesz go używać tak jak jest, ale może dać ci kilka pomysłów.

Istnieje trzecia droga.

Możesz zdecydować się na wdrożenie każdej nowej funkcji w aplikacji Symfony. Następnie możesz sprawić, że będą współistnieć zarówno aplikacje legacy, jak i Symfony. Na poziomie serwera (np. Nginx) możesz podać starsze adresy URL starszej aplikacji i wszystkie zmigrowane adresy URL do aplikacji Symfony2. W moim przypadku ten scenariusz był najlepszym rozwiązaniem i okazał się skuteczny. Jednak byliśmy zdecydowani porzucić starsze tworzenie aplikacji (więc każda nowa funkcja lub zmiana musiała zostać opracowana w aplikacji Symfony2).

Edit: oto jak można uruchomić jądro Symfony w app starszych i wysyła zdarzenie (co jest potrzebne do zapory):

$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

Wierzę, że można uzyskać dostęp do instancji pojemnik z aplikacji starszych w ten sposób

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

Tak, to działa. Dodałem linię wywołującą metodę "boot", która inicjuje kontener. Jednak nadal nie mogę korzystać z security.context, ponieważ jest on w dużym stopniu zależny od konfiguracji Symfony MVC. – chiborg

+0

Możesz uzyskać dostęp do kontekstu zabezpieczeń, takiego jak $ container-> get ('security.context'). – Sethunath

+0

Tak, ale próbowałem wywołać 'getToken' lub' isGranted' i otrzymałem 'AuthenticationCredentialsNotFoundException'. Zakładam więc, że użycie kontekstu bezpieczeństwa będzie działać tylko wtedy, gdy zainicjujesz obiekty żądań i routing w Symfony - czego nie mogę w tej chwili. – chiborg