MVC: куда включают логику формирования заголовков?
Заголовок сайта хранится в глобальных настройках, настройки каждого модуля (раздел статей, загрузок) скорее всего также будут в отдельных файлах. Вопрос - где именно мне формировать заголовок? Например, главная страница модуля имеет название вида "Название сайта / Название модуля" - кто будет брать эти переменные и склеивать их в таком виде - контроллер, модель или вью? Или например страница добавления материала тоже будет иметь своё название - где его хранить - в настройках (тогда какой класс должен его читать оттуда?) ? Или прописывать прямо в методе view? Или в методе showAddPage контроллера?
Сделал так:
Контроллер модуля подгружает настройки модуля в специальный синглтон Configurator (там же хранятся и глобальные настройки), затем при необходимости объекты настроек используют любые классы - так View подгружает себе настройки в конструкторе, а затем в каждом методе, отвечающем за конкретную страницу, формирует заголовок (который потом отображается в подгружаемом шаблоне).
Вы сами ответили на свой вопрос: куда включать логику формирования заголовков?
Суть MVC - отделение логики от представления. А контроллер служит лишь тоннелем передачи информации между ними. Модель - это и есть логика. Поэтому храните в модели.
P.S. Лично я для себя ее вообще именую LVC - Logics, Controllers, Views (просто потому что так соображается быстрее). И вообще, поскольку проект такой, что суть контроллера всегда одна и та же - подставить данные в шаблон (данные получаю в логике), то и контроллер использую один на все модели и представления.
Но это же логика... отображения? Модель у меня будет отдавать объект, сформированный из БД - то есть там будет просто название статьи например. А дальше надо будет написать в заголовке "<Название сайта> / статьи / <Название статьи> .
Неужели будет преступлением склеить это в методе View?
Посторонним В.: А завтра у вас кроме сущности "статья" появится "фотогалерея", "расписание", "список товаров" и у них будет другая схема создания заголовков. Это всё тоже будет во view?
Посторонним В.: Видимо мы не так друг друга поняли.
Получайте заголовки и прочее в модели, а выводите их в логике.
Где "клеить"? В шаблонизаторе. Повторюсь, у меня есть один файл контроллера для всех страниц:
<?php
class Castling {
public function Render($name, $data) {
$loader = new Twig_Loader_Filesystem($_SERVER['DOCUMENT_ROOT'] . '/app/views');
$twig = new Twig_Environment($loader);
$template = $twig->loadTemplate('view_' . strtolower($name) . '.tpl');
echo $template->render($data);
}
}
?>
И называется он castling.php (рокировка от английского. Почему рокировка? Потому что его суть - заменить одни данные на другие - переставить короля на место ладьи).
В нем просто подгружается Twig, который меняет данные, полученные в логике (модели) и передает их в шаблон (view). В вашем случае все идентично, но использовать один контроллер на все страницы не знаю, нужно ли (потому что мне не известны ваши намерения относительно проекта). В вашем случае вы получаете заголовок (из файла, БД, откуда угодно) в модели, передаете его в контроллер, в нем шаблонизатор (он может быть любым) меняет данные и передает в вид (view), который заголовок выводит.
И тогда вам не нужно будет бояться расширения, потом сможете и
<head>
{% block head %}
<link rel="stylesheet" href="">
<meta charset="utf-8">
{{ title }}
{% endblock %}
</head>
В контроллере поясните, что этот {{ title }}, который встретится в шаблоне равен переменной $title, которую вы получили в модели и в контроллер передали.
У меня всё распараллелено и ориентировано на гибкость - я могу сделать разную логику отображения для всех модулей.
View у меня представляет собой класс, отвечающий за один конкретный модуль, в нём методы для отображения каждой страницы - в методах берутся имеющиеся в объекте Response, конфигурационных файлах или др. источниках данные и из них формируются непосредственно переменные для вставки в шаблон (в шаблоне у меня принципиально нет функций, только переменные, точнее, элементы ассоциативного массива data).
Контроллер у меня только принимает данные от модели, помещает их в объект Response (оттуда потом их читает View), а также дёргает нужный метод View.
Посторонним В.: Ну Вам виднее, так как для каждого конкретного проекта лучше какое-то свое решение, не буду спорить о том, у кого правильнее - глупо. Но я думаю, что суть ясна: получаем в модели, подставляем в контроллере, форматируем и выводим в виде.
Верно, заголовки можно хранить в базе, и даже нужно) а с базой у нас модель общается.
в базовом классе модели можно написать метод назовем его к примеру GetPageTitle(); и когда у нас тянется модель, заголовок тоже будет выводиться
если у вас этот кусок кода будет использоваться только во вьюхе то его можно там и оставить, так как правильно это логика связана с выводом. Если часть кода будет использоваться не только здесь то имеет смысл вынести куда нибудь, это может быть хелпер с набором простых функций или статический класс, это может быть фабрика для генерации UI элементов, но кидать в модель не очень правильно так как это не относится к модели а относится к интерфейсу приложения.