2013-07-12 3 views
0

Symfony (v2.3) 방법에 문제가 있습니다.다른 템플릿으로 전달

기본적으로 두 개의 서로 다른 번들로 두 개의 컨트롤러가 있습니다. 앱의 데스크톱 버전은 DesktopBundle이고 모바일 버전은 MobileBundle이라고 가정 해 보겠습니다.

DesktopBundle의 동작 코드를 MobileBundle의 동작으로 다시 사용하고 싶습니다. 내가 지금하는 것은 앞으로입니다 :

namespace Acme\DesktopBundle\Controller; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; 

/** 
* @Route("/") 
*/ 
class IndexController extends Controller 
{ 
    /** 
    * @Route("", name="desktopIndex") 
    * @Template() 
    */ 
    public function indexAction() 
    { 
     /* some code I don't want to duplicate */ 

     return array(
      'some' => 'var' 
     ); 
    } 
} 

MobileController는

namespace Acme\MobileBundle\Controller; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; 

/** 
* @Route("/") 
*/ 
class IndexController extends Controller 
{ 
    /** 
    * @Route("", name="mobileIndex") 
    * @Template() 
    */ 
    public function indexAction() 
    { 
     return $this->forward('AcmeDesktopBundle:Index:index'); 
    } 
} 

지금은 작동

DesktopController하지만 분명히 Response 객체는 바탕 화면의 렌더링 템플릿으로 반환된다 버전은 indexAction입니다.

내가 원하는 것은 변수를 얻은 다음 모바일 버전의 템플릿을 렌더링하는 것입니다. 내가 뭘하려

데스크톱 버전으로 조건부 작업을 전방 방법으로 변수를 전달하고 렌더링하는 것입니다 : 이것은 일하는 것이

return $this->forward(
    'acmeDesktopBundle:Index:index', 
    array('mobile' => true) 
); 

,하지만 난 정말 내 코드를 변경하지 않으 DesktopBundle이지만 MobileBundle 만 이것을 달성 할 수있는 방법이 있습니까? 나는 뭔가를 놓치고 있습니까? 아니면 완전히 다른 해결책을 찾아야합니까?

답변

2

전달은 지정된 페이지로 리디렉션되지만 클라이언트의 URL은 변경하지 않습니다. 나는. 서버 측에서 리다이렉트한다. 액션의 반환 값에만 액세스하려면 간단히 호출하십시오. @Template 주석을 사용하면 매우 쉽게 만들 수 있습니다.

namespace Acme\MobileBundle\Controller; 

use Acme\DesktopBundle\Controller\IndexController as DesktopController; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; 

/** 
* @Route("/") 
*/ 
class IndexController extends Controller 
{ 
    /** 
    * @Route("", name="mobileIndex") 
    * @Template() 
    */ 
    public function indexAction() 
    { 
     $desktop = new DesktopController(); 
     $desktop->setContainer($this->container); 

     $values = $desktop->indexAction(); 
     // do something with it 

     return $values; 
    } 
} 
+0

예, 나는이 일을 시도하지만 난 나에게이 오류가 발생합니다 :'FatalErrorException을 : 오류 :의/var/www /에서 공급 업체의 비 객체의 멤버 함수의 get()로 전화/심포니/심포니/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php 라인 251' – Brewal

+0

그래, 컨테이너를 세워야 해. 내 편집을 참조하십시오. –

+0

나는 그것을 놓쳤다. 정말 멋진. 감사 :) – Brewal

관련 문제