2012-04-16 1 views
7

레거시 응용 프로그램을 Symfony 2 응용 프로그램과 통합하여 이전 응용 프로그램의 더 많은 부분을 Symfony 구성 요소로 대체하고 싶습니다. Symfony 2 애플리케이션 용으로 이미 구성된 서비스를 얻는 레거시 애플리케이션에서 Symfony 2 컨테이너를 사용하는 방법이 있습니다. 제가 사용하고자하는 첫 번째 서비스는 세션과 보안 컨텍스트입니다.레거시 응용 프로그램에서 Symfony 2 컨테이너를 사용하는 방법

질문 :

  • 이 가능합니까?
  • 구성된 서비스 컨테이너를 얻으려면 어떻게해야합니까?

일반적인 응용 프로그램의 일반적인 정보 : 단일 PHP 파일, "컨트롤러"(다른 실행 경로에 대해 $ _GET 및 $ _POST 확인). 각 페이지에는 자동 로딩, 데이터베이스 연결 등을 설정하는 init.php이 포함되어 있습니다. 세션 관리에는 데이터베이스 클래스의 정적 메소드 (!)에 대한 호출을 통해 데이터를 검색하는 자체 클래스가 있습니다.

+0

나는 가능하지 않다고 말할 수는 없지만 ... 물론 그럴 가치가 있습니까? 서비스 컨테이너를 구현하려면 프레임 워크의 핵심 인 Symfony2 커널을 구현해야한다고 생각하십시오. – AlterPHP

+0

레거시 앱의 구조에 대한 정보가 없으면이 질문에 답하는 것이 불가능합니다. 단, 주요 수정없이 OOP 이외의 코드에 대해서는 가능하지 않을 수 있습니다. – GordonM

+1

나는 이런 식으로했다. 정기 S2를 사용하여 S2 컨트롤러 작업을 시작했습니다. 컨트롤러에서 나는 레거시 초기화 코드를 호출 한 다음 컨트롤러라고 불렀다. 아주 많은 해킹이 있지만 괜찮습니다. 나는 당신이 이처럼 뭔가를하지 않고 제대로 설정된 S2 세션 객체를 얻는 것이 많은 행운을 가져올 것이라고 생각하지 않는다. – Cerad

답변

10

Symfony의 DIC를 독립 실행 형 구성 요소로 사용하는 경우 is possible 처음부터 전체 Symfony Framework를 사용할 계획이 아니므로 많은 것들을 "수동으로"해야합니다. DIC를 기존의 모든 것들로 많이 사용하지 않을 것입니다.

이 경로를 사용하려면 먼저 다른 구성 요소 (HttpFoundation 및 HttpKernel)를 선택하는 것이 좋습니다.

@Cerad는 Symfony에서 기존 코드를 래핑 할 수도 있다고 제안했습니다. IngewikkeldWrapperBundle 번들을 확인하십시오. 있는 그대로 사용할 수는 없지만 아이디어를 줄 수도 있습니다.

세 번째 방법이 있습니다.

모든 새로운 기능을 Symfony 앱에 구현하기로 결정할 수 있습니다. 기존 애플리케이션과 Symfony 애플리케이션을 함께 사용할 수 있습니다. 서버 수준 (예 : Nginx)에서는 레거시 URL을 기존 앱으로 프록시하고 모든 이전 된 URL을 Symfony2 앱으로 프록시 처리 할 수 ​​있습니다. 내 경우에는이 시나리오가 최선의 선택이었고 작동하는 것으로 나타났습니다. 그러나, 우리는 기존의 앱 개발을 포기할 것을 약속했습니다 (그래서 모든 새로운 기능이나 변경 사항은 Symfony2 앱에서 개발되어야했습니다).

편집 :

$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

난 당신이 기존 응용 프로그램에서 컨테이너 인스턴스에 액세스 할 수 있습니다 생각 : 여기 당신은 레거시 응용 프로그램의 심포니 커널을 부팅 (방화벽에 필요한되는) 이벤트를 파견 수있는 방법 like this

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

예, 작동합니다. 나는 컨테이너를 초기화하는 "boot"메소드를 호출하는 라인을 추가했다. 그러나 symfony MVC 설정에 크게 의존하기 때문에 security.context를 사용할 수 없습니다. – chiborg

+0

다음과 같은 보안 컨텍스트에 액세스 할 수 있습니다. $ container-> get ('security.context') – Sethunath

+0

네,하지만'getToken' 또는'isGranted'를 호출하려고 시도했으며'AuthenticationCredentialsNotFoundException'을 받았습니다. 따라서 보안 컨텍스트를 사용하는 것은 Symfony로 요청 개체와 라우팅을 초기화하는 경우에만 작동한다고 가정합니다. 지금은 할 수 없습니다. – chiborg

관련 문제