Как загрузить функцию контроллера и отобразить ее в теге ветки с помощью Symfony2?

Я использую Symfony2 и Twig. У меня есть функция (ниже) в моем контроллере, которая возвращает определенный текст. Можно ли вызвать эту функцию непосредственно из моего шаблона и изменить {{text}} в моем шаблоне на то, что возвращает функция, возможно, через Ajax?

Вот моя функция:

public function generateCode($url) {
    $url = $_SERVER['SERVER_NAME'] . '/embed/' . $url;
    $return = '<iframe>'.$url.'</iframe>';
    return $return;
}

Другая функция контроллера вызывает функцию выше и отображает мой шаблон:

public function getCodeAction($url) {
    $text = $this->generateCode($url);
    return $this->render('MyMyBundle:User:code.html.twig', array('text' => $text));
}

В моем шаблоне я использую:

{{ text }}

для отображения значения.


person Mike    schedule 27.11.2011    source источник


Ответы (6)


Вы можете использовать ajax, если у вас есть динамические данные, но, насколько я вижу из вашей краткой информации, вы всегда можете выполнить эту функцию контроллера прямо из вашего представления:

{% render "MyMyBundle:User:generateCode" with { 'url': 'your url here' } %}

Более подробная информация доступна по адресу: http://symfony.com/doc/2.0/quick_tour/the_view.html в разделе "Встраивание других контроллеров"

person Stelian    schedule 28.11.2011
comment
Спасибо. Сработало, только пришлось немного поиграться с методом рендеринга — теперь даже Ajax работает плавно. Спасибо! - person Mike; 28.11.2011
comment
@Mike Что ты имеешь в виду под игрой? - person k0pernikus; 17.09.2012

В Symfony 2.2 это было изменено.

Подпись и аргументы тега рендеринга изменились.

До:

{% render 'BlogBundle:Post:list' with { 'limit': 2 }, { 'alt': BlogBundle:Post:error' } %}

После:

{% render controller('BlogBundle:Post:list', { 'limit': 2 }), { 'alt': 'BlogBundle:Post:error' } %}

or

{{ render(controller('BlogBundle:Post:list', { 'limit': 2 }), { 'alt': 'BlogBundle:Post:error'}) }}

Примечание. Функция является предпочтительным способом.

См. https://github.com/symfony/symfony/blob/2.2/UPGRADE-2.2.md

person Dan Blows    schedule 07.02.2013
comment
во избежание путаницы: {{ render(controller(... }} — это функция - person Andrew Atkinson; 06.03.2013

Для справки, в новых версиях вам нужно использовать абсолютный URL:

{{ render url('my_route_id', {'param': value}) }}
person Mateo Tibaquira    schedule 14.03.2014

{{ render(controller("AcmeDemoBundle:Demo:topArticles", {'num': 10})) }}

person iamtankist    schedule 24.04.2014

В Silex я решил это так:

{{ render(url('route_name', {'param': value})) }}

Если у вас нет имени маршрута, можно использовать URL:

{{ render(app.request.baseUrl ~ '/some-path/' ~ value) }}

При использовании URL-адреса мы всегда должны объединять baseUrl.

person Raptor    schedule 28.10.2014

Симфони 2.6+

в ветке:

{{ render(controller('AppBundle:PropertySearch:featuredProperties', {'limit': 15})) }}

контроллер:

/**
 * featuredPropertiesAction
 * 
 * @param Request $request
 * @param int $limit
 *
 * @return Response
 */
public function featuredPropertiesAction(Request $request, $limit)
{
    $search = $this->resultsHelper->featuredSearch($limit);

    return $this->render('HASearchBundle::featured_properties.html.twig', [
        'search' => $search,
    ]);
}
person Ivan Proskuryakov    schedule 28.03.2016