Как сделать авто рендеринг в Symfony - PullRequest
0 голосов
/ 01 декабря 2011

Я предполагаю, что это просто не сделано, так как я нигде не могу найти ссылку на это, даже люди спрашивают без ответа. Хотя я надеюсь, что Symfony называет это как-то иначе.

Как заставить Symfony автоматически выполнять рендеринг views/{controller}/{action}.html.php

Ответы [ 4 ]

0 голосов
/ 02 декабря 2011

Когда вы делаете маршрутизацию с аннотациями вместо yaml, вы можете добавить @Template() к вашему методу действия, и он будет отображать шаблон по умолчанию в соответствии с вашими требованиями.

Для этого измените маршрут на аннотации:

AcmeDemoBundle:
    resource: "@PAcmeDemoBundle/Controller/"
    type: annotation
    prefix: /

В ваших контроллерах добавьте это для каждого действия:

/**
 * @Route("/index", name="demo_index")
 * @Template()
 */

На самом деле я не знаю, есть ли способ получить такое поведение, когда не используются аннотации. Но, как кажется, для этого есть логика, может быть и одна.

0 голосов
/ 01 декабря 2011

У вас есть два варианта:

1) Использовать SensioFrameworkExtraBundle - позволяет использовать аннотацию @Template. (Входит в SE).

2) Напишите свой собственный метод. Я нахожу раздражающим писать @Template и любые аннотации в контроллерах каждый раз, поэтому я добавил этот метод в базовый контроллер (это только пример, изучите его перед использованием в производстве):

public function view(array $parameters = array(), Response $response = null, $extension = '')
{
    $extension = !empty($extension) ? $extension : $this->templateExtension;
    $view = ViewTemplateResolver::resolve($this->get('request')->get('_controller'), get_called_class());
    return $this->render($view . '.' . $extension, $parameters, $response);
}


class ViewTemplateResolver
{

    public static function resolve($controller, $class)
    {
        $action = preg_replace('/(.*?:|Action$)/', '', $controller);
        if (preg_match('~(\w+)\\\\(\w+Bundle).*?(\w+(?=Controller$))~', $class, $name)) {
            return implode(':', array($name[1] . $name[2], $name[3], $action));
        }
    }
}

Теперь в контроллере мы можем сделать: return $this->view();

0 голосов
/ 01 декабря 2011

@ ответы мезе более желательны, чем нестандартное поведение.

Однако я думаю, что SensioFrameworkExtraBundle, на который он указал мне, дал мне подсказку, необходимую для достижения этой цели без замены моего собственного маршрута.

То есть подключиться к событию просмотра ядра .

Его назначение конкретно указано как:

Цель события - разрешить преобразование некоторого другого возвращаемого значения в ответ.

Я предполагаю, что его можно использовать для преобразования нулевого возврата из действия контроллера в ответ.

0 голосов
/ 01 декабря 2011

Нет, это невозможно в стандартной версии Symfony.Однако маршрутизация является лишь одним из ее компонентов .Поэтому, если вы действительно хотите, вы можете создать свой собственный компонент и использовать его вместо этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...