Я создаю структуру микро MVC в PHP для моего проекта. На самом деле это только VC, я не использую модели, вместо этого я выполняю всю логику контроллера (включая получение данных от mongodb).
У меня есть основной класс Controller с функцией renderView(...)
(которая выполняет некоторые проверки, извлекает массив данных в переменные и просто вызывает include() для каждого представления), и все контроллеры расширяют этот класс.
Также я написал свой собственный URL-маршрутизатор, где я могу указать, какой URL-адрес будет вызывать тот метод, с какого контроллера. Например:
/ -> Home::index()
/users/:id -> Users::showProfilePage($id)
/settings -> Users::showSettings()
и т.п.
Почти во всех методах я загружаю те же взгляды:
$this->renderView("header", "sidebar", <main view for the current page>, "footer", $data);
Теперь моя проблема в том, что я хочу использовать эти представления на большом количестве страниц, но, например, для header
и sidebar
нужна их собственная логика (PHP-код). Как я могу достичь этого, не копируя php-код для боковой панели для каждого контроллера и метода, который отображает sidebar
вида?
То, что вы действительно ищете, - это управление повторяющимися блоками шаблонов. Идея управления блоками довольно проста: вы определяете $blockName => $blockPath
а затем juse используете ее внутри других шаблонов.
Например, вы можете определить массив, подобный этому:
$blocks = array(
'footer' => __THEME_DIR__ . '/blocks/footer.phtml',
'head' => __THEME_DIR__ . '/block/header.phtnk'
);
И затем используйте внутри других шаблонов, так же, как:
<!DOCTYPE HTML>
<html>
<?php $this->loadBlock('head'); ?>
<body>
<main>
...
</main>
<?php $this->loadBlock('footer'); ?>
</body>
</html>
Это подход. Но прежде чем вы даже начнете, вам нужно настроить эти блоки для всех так называемых c Прежде всего, вам нужно избегать определения этого массива $blocks
в каждом контроллере. Чтобы решить эту проблему, вы можете просто написать abstract
контроллер, где вы определяете $blocks
только один раз, а потом все потомки наследуют его.
Например,
<?php
abstract class AppPresenter extends FrameworkPresenter
{
public function __construct()
{
$this->view->registerBlocks(array(
'header' => '....'
));
}
}
class UserPresenter extends AppPresenter
{
public function indexAction()
{
return $this->view->render('/index.phtml', array(
'var' => 'val'
));
}
}