我遇到了Symfony的forward
方法问题(v2.3)。
基本上,我有两个不同的捆绑包中的两个控制器。我们为应用的桌面版本说DesktopBundle
,为移动版本说MobileBundle
。
我想将DesktopBundle
的操作代码重用到MobileBundle
的操作中。我现在所做的是前锋:
DesktopController
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');
}
}
现在它可以正常工作,但显然Response
对象将返回indexAction
桌面版的呈现模板。
我想要的是获取变量然后渲染移动版本的模板。
我尝试将变量传递给forward方法,然后将操作有条件地渲染到桌面版本中:
return $this->forward(
'acmeDesktopBundle:Index:index',
array('mobile' => true)
);
这样可行,但我真的不想更改DesktopBundle
内的代码,只需更改MobileBundle
。有没有办法实现这个目标?我错过了什么,或者我应该采用完全不同的解决方案?
答案 0 :(得分: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;
}
}