【发布时间】:2013-07-12 09:15:10
【问题描述】:
我遇到了 Symfony (v2.3) 的 forward 方法的问题。
基本上,我在两个不同的捆绑包中有两个控制器。假设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'
);
}
}
移动控制器
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');
}
}
现在它可以工作了,但显然 Response 对象与 indexAction 的桌面版本的渲染模板一起返回。
我想要的是获取变量然后渲染移动版本的模板。
我尝试将一个变量传递给 forward 方法,然后有条件地将动作渲染到桌面版本中:
return $this->forward(
'acmeDesktopBundle:Index:index',
array('mobile' => true)
);
这可行,但我真的不想更改DesktopBundle 内的代码,而只想更改MobileBundle。有没有办法做到这一点?我遗漏了一些东西,还是应该采用完全不同的解决方案?
【问题讨论】: