HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Каждая страница любого сайта содержит свое собственное содержимое и общие части, такие как футер или боковое меню. Существует два подхода по работе с этими общими частями.</p>
1 <p>Каждая страница любого сайта содержит свое собственное содержимое и общие части, такие как футер или боковое меню. Существует два подхода по работе с этими общими частями.</p>
2 <h2>Включение</h2>
2 <h2>Включение</h2>
3 <p>До эры фреймворков фактически был ровно один способ выделять общие части. Он сводился к созданию двух шаблонов: хедера (шапка сайта) и футера (подвал). Затем эти шаблоны включались во всех остальных шаблонах, отвечающих за основную часть страницы. Выглядело это так:</p>
3 <p>До эры фреймворков фактически был ровно один способ выделять общие части. Он сводился к созданию двух шаблонов: хедера (шапка сайта) и футера (подвал). Затем эти шаблоны включались во всех остальных шаблонах, отвечающих за основную часть страницы. Выглядело это так:</p>
4 <p>Такой подход все еще популярен в самописных решениях и в популярных CMS. Где-то в силу исторических причин, где-то потому, что его очень просто понять и начать использовать.</p>
4 <p>Такой подход все еще популярен в самописных решениях и в популярных CMS. Где-то в силу исторических причин, где-то потому, что его очень просто понять и начать использовать.</p>
5 <p>С другой стороны, у такого подхода слишком много недостатков, из-за которых фреймворки отказались от него:</p>
5 <p>С другой стороны, у такого подхода слишком много недостатков, из-за которых фреймворки отказались от него:</p>
6 <ul><li>Футер и хедер хранят куски кода, которые сами по себе не являются правильным HTML: в хедере - открывающие теги, в футере - закрывающие. Из-за этого крайне легко ошибиться и потом долго искать незакрытый тег.</li>
6 <ul><li>Футер и хедер хранят куски кода, которые сами по себе не являются правильным HTML: в хедере - открывающие теги, в футере - закрывающие. Из-за этого крайне легко ошибиться и потом долго искать незакрытый тег.</li>
7 <li>Страница, разбитая на хедер и футер, не дает увидеть всю картину целиком. Придется скакать туда-сюда для понимания того, что из себя представляет страница.</li>
7 <li>Страница, разбитая на хедер и футер, не дает увидеть всю картину целиком. Придется скакать туда-сюда для понимания того, что из себя представляет страница.</li>
8 <li>Появляется очень много дублирования из-за постоянных вставок хедера и футера</li>
8 <li>Появляется очень много дублирования из-за постоянных вставок хедера и футера</li>
9 <li>Все сильно усложняется, если хедеры и футеры разные</li>
9 <li>Все сильно усложняется, если хедеры и футеры разные</li>
10 <li>Невозможно обработать ситуацию, когда страницы имеют более сложное разбиение и включение хедера и футера не поможет.</li>
10 <li>Невозможно обработать ситуацию, когда страницы имеют более сложное разбиение и включение хедера и футера не поможет.</li>
11 </ul><h2>Макеты</h2>
11 </ul><h2>Макеты</h2>
12 <p>Это совершенно другой подход при работе с шаблонами. Он строится не от шаблона конкретного обработчика (экшена), а от макета. Макет - это базовая структура страницы, в которую вставляются данные, сгенерированные конкретным обработчиком. Для работы макетов недостаточно стандартных PHP-файлов с HTML разметкой. Разработчикам шаблонизаторов приходится придумывать специальные маркеры, которые указывают, куда и какой блок можно поместить.</p>
12 <p>Это совершенно другой подход при работе с шаблонами. Он строится не от шаблона конкретного обработчика (экшена), а от макета. Макет - это базовая структура страницы, в которую вставляются данные, сгенерированные конкретным обработчиком. Для работы макетов недостаточно стандартных PHP-файлов с HTML разметкой. Разработчикам шаблонизаторов приходится придумывать специальные маркеры, которые указывают, куда и какой блок можно поместить.</p>
13 <p>В Laravel используется шаблонизатор<a>Blade</a>. Фактически, Blade это свой собственный язык, с помощью которого создаются шаблоны. Blade-специфичные команды в шаблонах начинаются со знака<em>@</em>и называются директивами. Большинство директив похожи на вызов функций, в которые передаются аргументы.</p>
13 <p>В Laravel используется шаблонизатор<a>Blade</a>. Фактически, Blade это свой собственный язык, с помощью которого создаются шаблоны. Blade-специфичные команды в шаблонах начинаются со знака<em>@</em>и называются директивами. Большинство директив похожи на вызов функций, в которые передаются аргументы.</p>
14 <p>В макете выше используется директива @yield. Она указывает на то, куда будет вставлен контент конкретного обработчика.</p>
14 <p>В макете выше используется директива @yield. Она указывает на то, куда будет вставлен контент конкретного обработчика.</p>
15 <p>В шаблоне самого обработчика, используется директива @section, которая определяет блок контента. Каждый такой блок имеет собственное имя, что позволяет одновременно делать вставку сразу множества блоков. Это особенно удобно для сложных макетов, где кроме самого контента, есть и другие блоки, специфичные для конкретных страниц.</p>
15 <p>В шаблоне самого обработчика, используется директива @section, которая определяет блок контента. Каждый такой блок имеет собственное имя, что позволяет одновременно делать вставку сразу множества блоков. Это особенно удобно для сложных макетов, где кроме самого контента, есть и другие блоки, специфичные для конкретных страниц.</p>
16 <p>Директива @extends указывает на макет, внутрь которого должны попасть данные из текущего шаблона. В эту директиву передается путь относительно директории<em>resources/views</em>. Обратите внимание, что вместо<em>/</em>используется точка.</p>
16 <p>Директива @extends указывает на макет, внутрь которого должны попасть данные из текущего шаблона. В эту директиву передается путь относительно директории<em>resources/views</em>. Обратите внимание, что вместо<em>/</em>используется точка.</p>
17 <p>Далее идут секции. У каждой секции есть имя, благодаря которому можно точечно управлять местом ее отображения. Выше создаются две секции<em>content</em>и<em>title</em>. Одна из них отображается в теге &lt;title&gt;, другая внутри &lt;body&gt; и является центральной контентной частью страницы.</p>
17 <p>Далее идут секции. У каждой секции есть имя, благодаря которому можно точечно управлять местом ее отображения. Выше создаются две секции<em>content</em>и<em>title</em>. Одна из них отображается в теге &lt;title&gt;, другая внутри &lt;body&gt; и является центральной контентной частью страницы.</p>
18 <p>Имена выбираются произвольно. Количество секций не ограничено. Количество макетов тоже.</p>
18 <p>Имена выбираются произвольно. Количество секций не ограничено. Количество макетов тоже.</p>
19 <p>Несмотря на наличие макетов, иногда бывает полезно иметь общий шаблон, который вставляется в конкретных местах. Blade позволяет создавать и включать такие шаблоны с помощью директивы @include:</p>
19 <p>Несмотря на наличие макетов, иногда бывает полезно иметь общий шаблон, который вставляется в конкретных местах. Blade позволяет создавать и включать такие шаблоны с помощью директивы @include:</p>
20 <p>Код, подобный, тому что выше, часто встречается в тех проектах где несколько макетов. Как правило, их общие части выносят в общие шаблоны, которые затем включаются через @include. Хорошей практикой считается помещать общие шаблоны в директорию<em>resources/views/shared</em>. Так легче понять какие шаблоны можно переиспользовать.</p>
20 <p>Код, подобный, тому что выше, часто встречается в тех проектах где несколько макетов. Как правило, их общие части выносят в общие шаблоны, которые затем включаются через @include. Хорошей практикой считается помещать общие шаблоны в директорию<em>resources/views/shared</em>. Так легче понять какие шаблоны можно переиспользовать.</p>