Symfony:内部转发vs渲染控制器

时间:2018-05-30 13:27:24

标签: symfony php-7 symfony3.x

我在简单的控制器中有简单的操作:

public function _targetAction(RequestStack $requestStack)
{
    $request = $requestStack->getMasterRequest();
    // ...
}

有两种方法可以称呼它。第一:

// The same or other controller
public function topAction(Request $request)
{
    // forward to SimpleController:_target
    return $this->forward('AppBundle:Simple:_target');
}

来自树枝(次级请求)的第二个:

// SimpleController
public function topAction(Request $request)
{
    // render
    return $this->render('AppBundle:Simple:top.html.twig');
}     

// top.html.twig
{{ render(controller('AppBundle:Simple:_target')) }}

我如何识别我在这种方法中使用SimpleController :: _ targetAction的方式:

public function _targetAction(RequestStack $requestStack)
{
    // what can i do here to uniquely identify current way
    // Note: $requestStack->getParentRequest() is not null in both cases
}

1 个答案:

答案 0 :(得分:1)

在我看来,如果你需要根据通话类型执行不同的代码,你应该考虑为每个动作创建separate routes

如果您真的想要使用相同的,我最好的方法是在路线上添加一个参数来识别请求。

    /**
     *
     * @Route("/target/{from}", name="_target")
     */
    public function _targetAction($from)
    {
        if($from == 'view'){
            // execute code for view call
        } else {
            // execute code for controller call
        }
    }

然后,当您调用它时,根据调用者类型传递不同的参数:

<强> TWIG

{{ render(controller('AppBundle:Simple:_target', { 'from': 'view' })) }}

<强> CONTROLLER

return $this->forward('_target', array('from' => 'controller'));