0

我遇到forward了 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'
        );
    }
}

移动控制器

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. 有没有办法做到这一点?我遗漏了一些东西,还是应该采用完全不同的解决方案?

4

1 回答 1

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;
    }
}
于 2013-07-12T10:06:51.373 回答