Я собираюсь выкинуть ответ здесь, потому что существует большая путаница в том, что следует и чего не следует делать с сухарями.
Модель
Модель представляет собой слой , который содержит вашу бизнес-логику , состоящую из объектов домена, картографических данных и служб. Подробнее о модели вы можете прочитать здесь .
Контроллер
Помните: толстая модель, тощие контроллеры . Ваш контроллер / метод доступен из вашего механизма маршрутизации. Как только вы окажетесь в контроллере, вы захотите получить объект модели, выполнить любую логику, требуемую в модели, вернуть результат этого в переменную вашего контроллера, а затем использовать это для отображения данных в вашем представлении.
Панировочные сухари
Как говорится, вашим сухарям нужны разные части для работы. Давайте подумаем об этом:
- Им нужна текущая страница
- Им нужен список страниц
- Им (возможно) нужно добавить пользовательский "class = current"
Разбиваем их:
- В моем фреймворке текущий контроллер также является именем страницы (контроллер входа отображается в / login). Итак, у нас уже есть текущая страница.
- Список страниц.
- Если ваши родительские / дочерние отношения страниц связаны напрямую с моделью данных , то в вашем контроллере вы извлекаете список страниц из модели . Поэтому используйте модель, если панировочные сухари могут быть автоматически сгенерированы .
- Если используемый вами фреймворк допускает панировочные сухари, созданные полностью по выбору пользователя, то вы просто выбираете, что добавлять в панировочные сухари вручную. В любом случае , вы указываете свои хлебные крошки в контроллере, и если вам нужно их откуда-то достать, используйте модель.
- Наконец, "класс = текущий". Хотя вы не должны содержать значительную «логику» в своем представлении, мелкие вещи, такие как циклы или если операторы довольно стандартны. Здесь вы должны проверить свои крошки на наличие заголовка, равного текущему имени контроллера (передаваемого в качестве переменной в представление), и добавить
class=current
, если найден.
Пример кода
Примечание: не проверено
/**
* So we're in the home controller, and index action
*
* @route localhost/home or localhost/home/index
* (depending on .htaccess, routing mechanism etc)
*/
class Home extends Controller
{
public function index()
{
// Get current class name, so we have the current page
$class = __CLASS__;
// Let's say the page heirachy is tied to the model, so get pages for current method, or however you want to implement it
$pages = $model->getPages($class);
// So the TEMPLATE handles the breadcrumbs creation, and the controller passes it the data that it needs, retrieved from the model
// (new Template) is PHP 5.4's constructor dereferencing, also included is some lovely method chaining
// setBreadcrumbs() would assign variables to the view
// Render would do just that
(new Template)->setBreadcrumbs($currentPage, $pages)->render();
}
}
А теперь, вид ... обратите внимание, я использую PHP 5.4, поэтому я могу использовать короткое эхо ...
<body>
<?php foreach($breadcrumbs as $b) { ?>
<li <?=($b['current'])?'class="current"':''?>>
<a href="<?=$b['page']['url']?>">
<?=$b['page']['title']?>
</a>
</li>
<?php } ?>
</body>
И вот как бы я это сделал. Отчасти это зависит от личных предпочтений, но я надеюсь, что это показывает один из способов сделать это и, по крайней мере, немного полезно.
Я действительно наткнулся на этот ответ, прибегая к помощи "php mvc breadcrumbs", и выписывание моего мозга действительно помогло мне в этом разобраться. Так что спасибо!