Symfony: внутренняя пересылка vs контроллер рендеринга

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

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
}

Не уверен, что вы пытаетесь сделать. Вы пробовали с ->isMasterRequest()?

emix 30.05.2018 15:30

@emix isMasterRequest Я могу вызвать только KernelEvent, не уверен, что это хорошая идея, попытаться получить событие в действии контроллера.

ZloyPotroh 30.05.2018 15:36

То, что вы пытаетесь сделать, совсем не лучшая идея. Что вы пытаетесь достичь?

emix 30.05.2018 16:02

Контроллер рендеринга @emix - плохая идея? Альтернативы? Я пытаюсь справиться с синхронизацией. и запросы ajax одним действием (topAction), но если бы все было так просто, я бы использовал isXmlHttpRequest () ... В любом случае, я уже нашел решение. Но вопрос остается открытым.

ZloyPotroh 30.05.2018 18:27

Вы можете использовать третий параметр контроллера рендеринга, который является вашими ключами / значениями POST{{ render(controller(Controller:Action, { parameter: value }, { post_parameter: value })) }}

Preciel 31.05.2018 03:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
5
231
1

Ответы 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' })) }}

КОНТРОЛЛЕР

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

это очевидное решение, это первое, о чем я подумал. Но если только в targetAction?

ZloyPotroh 30.05.2018 18:31

Извините, не могли бы вы лучше объяснить свой вопрос? только в targetAction?

Isaac Bosca 31.05.2018 00:23

Я имею в виду, что, возможно, это можно сделать внутри Simple :: _ targetAction, используя некоторые «симптомы» RequestStack, без передачи дополнительных параметров.

ZloyPotroh 01.06.2018 11:37

Возможно, вы можете использовать $currentRequest->headers->get('referer');, но, на мой взгляд, это усложняет ситуацию.

Isaac Bosca 01.06.2018 14:13

Другие вопросы по теме