У меня простое действие в простом контроллере:
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
}
@emix isMasterRequest Я могу вызвать только KernelEvent, не уверен, что это хорошая идея, попытаться получить событие в действии контроллера.
То, что вы пытаетесь сделать, совсем не лучшая идея. Что вы пытаетесь достичь?
Контроллер рендеринга @emix - плохая идея? Альтернативы? Я пытаюсь справиться с синхронизацией. и запросы ajax одним действием (topAction), но если бы все было так просто, я бы использовал isXmlHttpRequest () ... В любом случае, я уже нашел решение. Но вопрос остается открытым.
Вы можете использовать третий параметр контроллера рендеринга, который является вашими ключами / значениями POST{{ render(controller(Controller:Action, { parameter: value }, { post_parameter: value })) }}




На мой взгляд, если вам нужно выполнить другой код в зависимости от типа вызова, вам следует подумать о создании 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?
Извините, не могли бы вы лучше объяснить свой вопрос? только в targetAction?
Я имею в виду, что, возможно, это можно сделать внутри Simple :: _ targetAction, используя некоторые «симптомы» RequestStack, без передачи дополнительных параметров.
Возможно, вы можете использовать $currentRequest->headers->get('referer');, но, на мой взгляд, это усложняет ситуацию.
Не уверен, что вы пытаетесь сделать. Вы пробовали с
->isMasterRequest()?