Symfony: внутреннее перенаправление против контроллера рендера - PullRequest
0 голосов
/ 30 мая 2018

У меня есть простое действие в простом контроллере:

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 голосов
/ 30 мая 2018

По моему мнению, если вам нужно выполнить различный код в зависимости от типа вызова, вам следует подумать о создании 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' })) }}

КОНТРОЛЛЕР

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