Шаблоны

Шаблоны

Когда 20 лет назад был создан PHP, разработчики полюбили его простоту и то, как он хорошо сливался с HTML и динамическим кодом. Но с прошествием времени, были созданы другие языки шаблонов, вроде Twig, чтобы сделать шаблоны ещё лучше.

Best Practice

Используйте формат шаблонов Twig для ваших шаблонов.

Просто говоря, PHP-шаблоны намного более подробные по сравнению с Twig, так как им не хватает родной поддержки для большинства современных функций, необходимых шаблонам, вроде наследования, автоматического экранирования, названных аргументов для фильтров и функций.

Twig это формат шаблонов по умолчанию в Symfony, который имеет наибольшую поддержку общества всех не-PHP шаблонизаторов (он используется в высококлассных проектах вроде Drupal 8).

Кроме того, Twig - это едиственный формат шаблонов с гарантированной поддержкой Symfony 3.0. Если уж на то пошло, PHP может быть удалён из официально поддерживаемых движков шаблонов.

Расположение шаблонов

Best Practice

Храните все шаблоны вашего приложения в каталоге app/Resources/views/.

По традиции, разработчики Symfony хранили шаблоны приложения в каталоге Resources/views/ каждого пакета. Потом они использовали логическое имя, чтобы ссылаться на них (например, AcmeDemoBundle:Default:index.html.twig).

Но для шаблонов, использованных в вашем приложении, намного удобнее хранить их в каталоге app/Resources/views/. Для начала, это значительно упрощает их логические имена:

Шаблоны, хранящиеся в пакетах Шаблоны, хранящиеся в app/
AcmeDemoBundle:Default:index.html.twig default/index.html.twig
::layout.html.twig layout.html.twig
AcmeDemoBundle::index.html.twig index.html.twig
AcmeDemoBundle:Default:subdir/index.html.twig default/subdir/index.html.twig
AcmeDemoBundle:Default/subdir:index.html.twig default/subdir/index.html.twig

Ещё одно преимущество в том, что централизация ваших шаблонов облегчает работу ваших дизайнеров. Им не нужно искать шаблоны в куче разных каталогов, разбросанных по разным пакетам.

Best Practice

Используйте snake_case нижнего регистра для имён каталогов и шаблонов.

Расширения Twig

Best Practice

Определите ваши расширения Twig в каталоге AppBundle/Twig/. Ваше приложение будет автоматически определять и конфигурировать их.

Нашему приложению нужен пользовательский фильтр Twig md2html, чтобы мы могли трансформирвать содержимое Markdown каждого поста в HTML.

Чтобы сделать это, во-первых, установите отличный анализатор Markdown Parsedown в качестве новой зависимости проекта:

1
$ composer require erusev/parsedown

Далее, создайте новый класс Markdown, который будет использован позже расширением Twig. Ему нужно только определять единственный метод для преобразования содержимого Markdown в HTML:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
namespace AppBundle\Utils;

class Markdown
{
    private $parser;

    public function __construct()
    {
        $this->parser = new \Parsedown();
    }

    public function toHtml($text)
    {
        $html = $this->parser->text($text);

        return $html;
    }
}

Далее, создайте новое расширение Twig и определите новый фильтр под названием md2html, используя класс Twig_SimpleFilter. Внедрите новопределённый класс Markdown в конструктор расширения Twig:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
namespace AppBundle\Twig;

use AppBundle\Utils\Markdown;

class AppExtension extends \Twig_Extension
{
    private $parser;

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

    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter(
                'md2html',
                array($this, 'markdownToHtml'),
                array('is_safe' => array('html'))
            ),
        );
    }

    public function markdownToHtml($content)
    {
        return $this->parser->toHtml($content);
    }

    public function getName()
    {
        return 'app_extension';
    }
}

Вот и всё!

Если вы использоуете конфигурацию services.yml по умолчанию, то вы закончили! Symfony автоматически узнает о вашем новом сервисе и тегирует его для использования в качестве расширения Twig.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.