Custom MVC Framework: как распространить данные на представление? - PullRequest
0 голосов
/ 16 октября 2011

Я создаю пользовательский MVC-фреймворк.

Я немного смоделировал его после фреймворка codeIgniter, но по большей части он является обычным.

Я нахожусь в точке, где у меня есть маршрутизация URL к соответствующим действиям контроллера, но я застрял в точке, где я генерирую представление, которое может использовать данные, сгенерированные контроллером.

У меня определены представления (статический HTML со встроенным php, готовым для заполнения динамических данных), и у меня есть деструктор моего базового контроллера require () для представления представления в браузере ... вот код:

public function __destruct()
{
    if ($this->bSuppressView === false)
    {
        require(APP_PATH.'views/layout/header.php');
        require(APP_PATH.'views/'.$this->sController.'/view.'.$this->sController.'.'.$this->sAction.'.php');
        require(APP_PATH.'views/layout/footer.php');
    }
}

Обычно, когда контроллер завершает выполнение, процесс разрыва базового контроллера будет включать в себя представление глобального заголовка, представление действия контроллера, а затем представление глобального нижнего колонтитула, которое должно заполнять веб-страницу всем для URL, который был запрошен ...

ОДНАКО, я не могу получить доступ к глобально определенным переменным из встроенного php в коде представления. В моем классе начальной загрузки я определяю кучу локальных переменных, таких как моя переменная конфигурации и т. Д., Но кажется, что представление считает эти переменные неопределенными. Кроме того, я не уверен, как разрешить представлению доступ к данным, которые, возможно, сгенерировал контроллер. Где я могу «приклеить» его, чтобы сделать его доступным для просмотра?

Дайте мне знать, если это не ясно, и я обновлю. Спасибо!

ОБНОВЛЕНИЕ: Я обнаружил, что, делая это таким образом, «среда» представлений находится внутри объекта контроллера, что, насколько я могу судить, является отличной вещью! Мне не нужно распространять что-либо еще, кроме как в контроллере, и я могу использовать «$ this->» в представлениях, чтобы получить доступ ко всему общему или частному из класса контроллера !!!

Это оставляет вопрос: это "нормально", как это делается в MVC? Какой лучший способ пропагандировать вид? Я думаю, что это будет соответствовать моим целям, и я отправлю обратно, если обнаружу ограничение, просто относящееся к встроенному представлению php как «в рамках вызывающего контроллера» ...

1 Ответ

1 голос
/ 16 октября 2011

То, как это обычно делается, заключается в том, что представление на самом деле является объектом.Вы передаете этот объект как переменные, и этот объект представления берет шаблон, который вы ему дали, включает его, чтобы он находился в текущей области видимости, и захватывает выходные данные в переменную, используя буферизацию вывода.

Чтобы дать вам основную идею:

// controller object
$this->set('key','val');
$this->render('mytemplate');

// controller base class
$view = new View;
$view->setData($this->getData());

// view class
class View {
....
function render() {
    ob_start();
    include $this->resolveTemplate();
    $out = ob_get_contents();

    ob_end_clean();

    return $out;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...