Основной объект запроса Symfony2 в частичном контроллере - PullRequest
1 голос
/ 28 января 2012

Я использую Twig Render и в частичном контроллере хочу получить имя основного контроллера, но

$this->get('request')->get('_template')->get('controller')

возврат partial.

Как я могу получить объект основного запроса в частичном контроллере?

Теперь я использую:

{% render 'FooBundle::Controller:action' with {'controller': getControllerName()  } %}

с пользовательской функцией Twig. Может быть, есть более элегантные способы сделать это?

Ответы [ 2 ]

2 голосов
/ 29 января 2012

Вам нужно будет явно передать это значение в теге рендеринга.

{% render 'AcmeBundle:Demo:something' with { 'via': app.request.attributes.get('_controller') } %}
2 голосов
/ 29 января 2012

Вам, вероятно, понадобится тег include, который включает другой шаблон.

{% include 'FooBundle::partial.html.twig' %}

Включение шаблонов предназначено для простых случаев, когда вам просто необходимы такие вещи, как частичные.

Тег render предназначен для вызова контроллеров, выполнения более сложных задач или если ваш шаблон не может получить доступ к переменным, необходимым для простого отображения. При этом ядро ​​создает новый запрос, как если бы он пришел как отдельный запрос. Фактически, используя ESI, это может быть отдельный запрос к этому контроллеру. Подробнее см. Здесь . Из-за этого вы не можете получить основной объект запроса, вероятно, нет основного объекта запроса, потому что вы используете ESI или потому что вы создаете маршрут для этого контроллера и вызываете его через AJAX или что-то еще. Опираясь на информацию о том, что ваш контроллер вызывается посредством подзапроса, инфраструктура, как я знаю, не поддерживается, и я думаю, что это сделано намеренно. Вы должны передать всю информацию в параметрах запроса.

Ваш пример неверен, это будет выглядеть так:

{% render 'FooBundle:MyController:actionName' ... %}

У вас должен быть такой класс FooBundle\Controller\MyControllerController, чтобы он мог работать.

namespace FooBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class MyControllerController extends Controller {
    public function actionNameAction() {
    ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...