@Dreaded

Что из себя представляет, и как правильно выводить слой представления в MVC?

Возможно, мой вопрос звучит странно, но прошу простить меня, ибо я только начал осваивать MVC , и сейчас постараюсь сформулировать вопрос почётче :)

Итак, первый вопрос, правильно ли я понял, что к разделу "Views" относятся исключительно шаблоны. Т.е. то, что мы показываем пользователю?

Я написал следующий класс, для вывода изображения:

class View
{
    protected $variables = array();

    /**
     * Сохраняет данные передаваемые в шаблон по заданному имени.
     *
     * @param $name Имя переменной в шаблоне
     * @param $value Значение переменной в шаблоне
     *
     * @return $this
     */
    public function assign($name, $value)
    {
        $this->variables[$name] = $value;
        return $this;
    }


    /**
     * Загружает указанный шаблон с заранее сохранёнными данными
     *
     * @param $template Путь к шаблону.
     *
     * @return string
     */
    public function render($template)
    {
        extract($this->variables);
        ob_start();
        require_once $template;
        return $content = ob_get_clean();
    }

    public function display($template)
    {
        extract($this->variables);
        ob_start();
        require_once $template;
        echo $content = ob_get_clean();
    }
}


И, собственно вопрос второй - к чему он будет относится ? Это модель, вью или контроллер? В какой папке проекта должен лежать этот класс? Или не стоит описывать отдельный класс, а просто описать методы этого класса в базовом контроллере и наследоваться от него?

Ну и основной вопрос - как всё таки правильно вывести слой представления пользователю?
Пока что я вижу такой вариант: в контроллере получаю данные модели, создаю объект класса View(там же в методе контроллера) и с его помощью подключаю необходимый шаблон? Смущает только неопределённость на счёт класса View.
  • Вопрос задан
  • 114 просмотров
Решения вопроса 2
@Yan-s
Есть разные трактовки этой концепции. И в общем то она не обязательно подразумевает разделение на файлы.

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

Не всё должно относится к модели, представлению или контроллеру. Ваш класс, например, обслуживает представление, но сам им не является.

Этот код вполне заслуженно выделен в отдельный класс, а в какую папку его поместить - решать вам.
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Пока что я вижу такой вариант: в контроллере получаю данные модели, создаю объект класса View(там же в методе контроллера) и с его помощью подключаю необходимый шаблон

Обычно так и делают, вью определяют в конструкторе как свойство контроллера, отовсюду изнутри контроллера соответственно он виден как $this->view; Шаблон обычно в виде прописан по умолчанию(что бы не дергать каждый раз набор из шапки, футера, слайдера етц), а вот контент в него "рендерится", и обычно берется из папки вьюшек с тем же именем что и контроллер+экшн. это сильно упрощает подключение вьюх, достаточно вызвать метод $this->view->renderView(); и в шаблон по умолчанию в определенном месте рендерится вьюха из нужной папки с нужным именем(например /engine/view/index/index.tpl для индекс контроллера + индекс экшна). Это как вариант.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@VadimKholodilo
Можете его положить в папку с базовыми компонентами вашего движка, а вообще, чтоб лучше понять MVC советую глянуть в сторону Yii2. Тогда вам проще будет понять то, как стоит, а как нет.
Ответ написан
Комментировать
dmitriylanets
@dmitriylanets
веб-разработчик
1.Не понимаю почему два разных меда делают одно и тоже
2.вывод через echo не очень удачное решение, используйте response
3. Все это ближе к к контроллеру
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы