2014-11-08 3 views
0

Я создаю структуру микро MVC в PHP для моего проекта. На самом деле это только VC, я не использую модели, вместо этого я выполняю всю логику контроллера (включая получение данных от mongodb)., используя тот же вид между страницами

У меня есть основной класс контроллера с функцией 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?

+0

Ну .. если нет модели, то почему, черт возьми, вы называете его «MVC»? –

ответ

0

Что вы действительно ищете, так это то, как управлять повторяющимися блоками шаблонов. Идея управления блоками довольно проста: вы определяете пару $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' 
     )); 
    } 
} 
Смежные вопросы