Что такое Symfony2 эквивалент компонентов в Symfony1? - PullRequest
20 голосов
/ 22 мая 2011

В моем приложении Symfony2 я хочу, чтобы виджет отображался на разных страницах.Это не может быть определено только его шаблоном, ему нужно вызвать БД и пройти через контроллер.

В Symfony1 я бы создал компонент и включил его.Как я могу сделать то же самое в Symfony2?

Ответы [ 2 ]

27 голосов
/ 23 мая 2011

Я провел еще несколько исследований, и самым простым способом, который я нашел, была простая строка в шаблоне:

{% render 'MyBundle:MyController:myAction' %}

Выводит результат действия с шаблоном, указанным в действии.

8 голосов
/ 22 мая 2011

Вы можете создать Twig Extension с функцией widget и зарегистрировать его в контейнере. Также введите Kernel в это расширение.

class WidgetFactoryExtension extends \Twig_Extension
{
    protected $kernel;

    public function __construct($kernel)
    {
        $this->kernel= $kernel;
    }

    public function getFunctions()
    {
        return array(
            'widget' => new \Twig_Function_Method($this, 'createWidget', array('is_safe' => array('html'))),
        );
    }

    public function createWidget($name, array $options = array())
    {
        list($bundle, $widget) = explode(':', $name);

        $widgetClass = $this->kernel->getBundle($bundle)->getNamespace() . '\\Widget\\' . $widget;
        $widgetObj = new $widgetClass();

        $widgetObj->setContainer($this->kernel->getContainer());

        if ($options) {
            $widgetObj->setOptions($options);
        }

        return $widgetObj;
    }
}

И после этого пишите в шаблонах:

{{ widget('QuestionsBundle:LastAnswers', {'answersCount' : 10}) }}
{# class QuestionsBundle/Widget/LastAnswers #}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...