MVC: зачем "отправлять" данные в View - PullRequest
4 голосов
/ 30 октября 2011

Я очень новичок в MVC, и поэтому я рыскал в сети, пытаясь построить свою собственную платформу, чтобы получить реальное понимание того, как работает вся концепция.

В любом случае, почти все учебники, посвященные MVC, всегда, кажется, присваивают данные, которые должны быть отображены в представлении, промежуточной переменной, которая затем используется в представлении.

Мой вопрос: зачем беспокоиться об этом дополнительном шаге?

Большинство реализаций MVC в конечном итоге включают в себя представление В контроллере ... поэтому, если это так, зачем тратить время / память / ЦП на создание промежуточной переменной / массива, которая затем передается в View, когда заканчивается View. быть включенным с контроллером в конце.

Не имеет ли больше смысла просто использовать переменные контроллера непосредственно в самом представлении?

Вот пример кода, который, надеюсь, прояснит, что я имею в виду:

class News_Controller 
{

public function main(array $getVars)
{
    $newsModel = new News_Model;

    //get an article
    $article = $newsModel->get_article($getVars['article']);

    //create a new view and pass it our template name
    $view = new View_Model($this->templateName);

    //assign article data to view
    $view->assign('title' , $article['title']);
    $view->assign('content' , $article['content']);
    $view->render();
}

Функция рендеринга - это, в основном, просто включение, чтобы перенести представление в контроллер для отображения вниз по цепочке. Если это то, что происходит, можно просто использовать $ article непосредственно в View, а не проходить через сложную процедуру назначения переменных для View.

Ответы [ 4 ]

4 голосов
/ 30 октября 2011

Имейте в виду, что PHP копирует при записи.Таким образом, простое присвоение переменной не оказывает существенного влияния на производительность.

Как уже упоминалось, область применения здесь является большой проблемой.Представление является отдельным объектом от контроллера и не имеет доступа к его данным.Конечно, вы можете передать экземпляр контроллера в представление, но это создает излишне строгую связь между ними.Представление должно работать независимо от контроллера.

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

Во-вторых, процесс назначения данных для представления может выполнять некоторую очистку данных или другую дополнительную работу.Например, в моей структуре я считаю все данные, передаваемые в представление HTML, небезопасными.Когда данные передаются в представление (если явно не помечено как безопасное), оно кодируется с помощью htmlspecialchars.

Наконец, вы всегда можете назначить объектам или массивам представление:

$view->assign('article', $article);

Если вы делаете это, вам, как правило, не нужно назначать слишком много вещей.(И если вы это сделаете, возможно, ваша страница делает слишком много разных вещей.)

4 голосов
/ 30 октября 2011

MVC - очень свободная классификация.Вы описываете, как он может работать.Также возможно, что переменные, которые вы используете в вашем контроллере, могут быть не предназначены для использования как есть в вашем представлении.У вас может быть какой-то процессор шаблонов, который принимает данные из контроллера вместе со специально размеченным шаблоном представления и выдает результат.Или вы можете вызывать функции / методы из вашего представления, которые возвращают готовую разметку.

3 голосов
/ 30 октября 2011

ваше включение все наследует от области переменных метода render (), но метод render () ничего не наследует от области переменных контроллера.

class foo {

   public function bar() {
      echo $somevar;
   }
}

$somevar = 'test';
$foo = new foo();
$foo->bar();

этот код ничего не отобразит и даст вампредупреждение о том, что $ somevar не было определено (если в вашем отчете об ошибках задано отображение предупреждений).Причина этого в том, что методы и функции не наследуют область, из которой они были вызваны.

php.net / manual / en / language.variables.scope.php

php.нетто / ручной / EN / language.oop5.visibility.php

2 голосов
/ 30 октября 2011

Из-за области действия переменных контроллеров. Если вы не сделаете все глобальным (очень плохая идея), ваша концепция не будет работать.

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