转发另一个模板

时间:2013-07-12 09:15:10

标签: php templates symfony

我遇到了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。有没有办法实现这个目标?我错过了什么,或者我应该采用完全不同的解决方案?

1 个答案:

答案 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;
    }
}