Передача данных с контроллера на View в приложении PHP MVC. Передача данных с контроллера на View в приложении PHP MVC Травление и внедрение логов при локальном инклуде файлов

Почти во всех учебниках или ответах на SO я вижу общий способ отправки данных с контроллера на представление, класс View часто выглядит примерно так же, как и код ниже:

Class View { protected $_file; protected $_data = array(); public function __construct($file) { $this->_file = $file; } public function set($key, $value) { $this->_data[$key] = $value; } public function get($key) { return $this->_data[$key]; } public function output() { if (!file_exists($this->_file)) { throw new Exception("Template " . $this->_file . " doesn"t exist."); } extract($this->_data); ob_start(); include($this->_file); $output = ob_get_contents(); ob_end_clean(); echo $output; } }

Я не понимаю, почему мне нужно поместить данные в массив, а затем вызвать extract ($ this -> _ data). Почему бы просто не поместить прямо какие-либо свойства в представление с контроллера, как

$this->_view->title = "hello world";

то в моем макете или файле шаблона я мог бы просто сделать:

Echo $this->title;

Логично логически группировать данные вида и отличать его от свойств класса внутреннего вида.

PHP позволит вам динамически назначать свойства, чтобы вы могли просто создать экземпляр класса View и присвоить свои данные в виде свойств. Лично я бы не рекомендовал этого. Что делать, если вы хотите перебирать данные просмотра или просто просто выгружать их для отладки?

Сохранение данных вида в массиве или содержащий объект dosn"t означает, что вам нужно использовать $this->get("x") для доступа к нему. Опция заключается в использовании перегрузки свойств PHP5, которая позволит вам хранить данные в виде массива, но иметь интерфейс $this->x с данными из шаблона.

Class View { protected $_data = array(); ... ... public function __get($name) { if (array_key_exists($name, $this->_data)) { return $this->_data[$name]; } } }

Метод __get() будет вызываться, если вы попытаетесь получить доступ к свойству, которое не существует. Итак, теперь вы можете:

$view = new View("home.php"); $view->set("title", "Stackoverflow");

В шаблоне:

Я предполагаю, что причиной может быть просто «меньше набрав», но у него есть хорошие побочные эффекты:

  • Помогает, когда те, кто пишет шаблоны, не знакомы с php, и таким образом им не нужно беспокоиться о том, «что может означать этот $this-> ? ».
  • Наличие отдельного контейнера для переменных также помогает, когда есть некоторые свойства представления, которые должны быть приватными для этого класса, и библиотекаторы не хотят подвергать их шаблонам
  • Предотвращает конфликты имен с собственными свойствами представления и переменными для шаблонов.
  • Гораздо быстрее, чем схемы доступа на основе методов. Не может быть актуальным сейчас, как это было, когда, например, был создан smarty (также работал с php4).

(PHP 4, PHP 5, PHP 7)

file — Читает содержимое файла и помещает его в массив

Описание

Array file (string $filename [, int $flags = 0 [, resource $context ]])

Читает содержимое файла и помещает его в массив.

Замечание :

Можно также использовать функцию file_get_contents() для получения файла в виде строки.

Список параметров

Путь к файлу.

Подсказка

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers . Смотрите более подробную информацию об определении имени файла в описании функции fopen() . Смотрите также список поддерживаемых оберток URL, их возможности, замечания по использованию и список предопределенных констант в Поддерживаемые протоколы и обработчики (wrappers) .

В качестве необязательного параметра flags может можно указать одну или более следующих констант: FILE_USE_INCLUDE_PATH Ищет файл в include_path . FILE_IGNORE_NEW_LINES Не добавлять новую строку к концу каждого элемента массива FILE_SKIP_EMPTY_LINES Пропускать пустые строки

Context

Ресурс контекста, созданный функцией stream_context_create() .

Замечание : Поддержка контекста была добавлена в PHP 5.0.0. Для описания контекстов смотрите раздел Потоки .

Возвращаемые значения

Возвращает файл в виде массива. Каждый элемент массива соответствует строке файла, с символами новой строки включительно. В случае ошибки file() возвращает FALSE .

Замечание :

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

Замечание : Если у вас возникают проблемы с распознаванием PHP концов строк при чтении или создании файлов на Macintosh-совместимом компьютере, включение опции auto_detect_line_endings может помочь решить проблему.

Список изменений Примеры

Пример #1 Пример использования file()

Примечания

Внимание

При использовании SSL, Microsoft IIS нарушает протокол, закрывая соединение без отправки индикатора close_notify . PHP сообщит об этом как "SSL: Fatal Protocol Error" в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны установить error_reporting на уровень, исключающий E_WARNING. PHP версий 4.3.7 и старше умеет определять, что на стороне сервера находится проблемный IIS при открытии потока с помощью обертки https:// и не выводит предупреждение. Если вы используете fsockopen() для создания ssl:// сокета, вы сами отвечаете за определение и подавление этого предупреждения.

12.1K

Шаблон проектирования Модель-Представление-Контроллер (MVC) — это шаблон программной архитектуры, построенный на основе сохранения представления данных отдельно от методов, которые взаимодействуют с данными.

Не смотря на то, что схема MVC была первоначально разработана для персональных компьютеров, она была адаптирована и широко используется веб-разработчиками из-за точного разграничения задач и возможности повторного использования кода. Схема стимулирует развитие модульных систем, что позволяет разработчикам быстро обновлять, добавлять или удалять функционал.

В этой статье я опишу основные принципы, а также рассмотрю определение схемы построения и простой MVC PHP пример.

Что такое MVC

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


На рисунке показана структура одностороннего потока данных и пути его следования между различными компонентами, а также их взаимодействие. Модель

Моделью называют постоянное хранилище данных, используемых во всей структуре. Она должна обеспечивать доступ к данным для их просмотра, отбора или записи. В общей структуре «Модель » является мостом между компонентами «Представление » и «Контроллер ».

При этом «Модель » не имеет никакой связи или информации о том, что происходит с данными, когда они передаются компонентам «Представление » или «Контроллер ». Единственная задача «Модели » — обработка данных в постоянном хранилище, поиск и подготовка данных, передаваемых другим составляющим MVC .

«Модель » должна выступать в качестве «привратника », стоящего возле хранилища данных и не задающего вопросов, но принимающего все поступающие запросы. Зачастую это наиболее сложная часть системы MVC . Компонент «Модель » — это вершина всей структуры, так как без нее невозможна связь между «Контроллером » и «Представлением ».

Представление

Представление — это часть системы, в которой данным, запрашиваемым у «Модели », задается окончательный вид их вывода. В веб-приложениях, созданных на основе MVC , «Представление » — это компонент, в котором генерируется и отображается HTML -код.

Представление также перехватывает действие пользователя, которое затем передается «Контроллеру ». Характерным примером этого является кнопка, генерируемая «Представлением ». Когда пользователь нажимает ее, запускается действие в «Контроллере».

Существует несколько распространенных заблуждений относительно компонента «Представление ». Например, многие ошибочно полагают, что «Представление » не имеет никакой связи с «Моделью », а все отображаемые данные передаются от «Контроллера ». В действительности такая схема потока данных не учитывает теорию, лежащую в основе MVC архитектуры. В своей статье Фабио Чеваско описывает этот некорректный подход на примере одного из нетрадиционных MVC PHP фреймворков:

«Чтобы правильно применять архитектуру MVC, между «Моделью» и «Представлением» не должно быть никакого взаимодействия: вся логика обрабатывается «Контроллером».

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

Компоненту «Представление » никогда не передаются данные непосредственно «Контроллером ». Между «Представлением » и «Контроллером » нет прямой связи — они соединяются с помощью «Модели ».

Контроллер

Его задача заключается в обработке данных, которые пользователь вводит и обновлении «Модели ». Это единственная часть схемы, для которой необходимо взаимодействие пользователя.

«Контроллер » можно определить, как сборщик информации, которая затем передается в «Модель » с последующей организацией для хранения. Он не содержит никакой другой логики, кроме необходимости собрать входящие данные. «Контроллер » также подключается только к одному «Представлению » и одной «Модели ». Это создает систему с односторонним потоком данных с одним входом и одним выходом в точках обмена данными.

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

Также распространенной ошибкой является наделение «Контроллера » функциями, которые отвечают только за обработку и передачу данных из «Модели » в «Представление ». Но согласно структуре MVC паттерна это взаимодействие должно осуществляться между «Моделью » и «Представлением ».

MVC в PHP

Напишем на PHP веб-приложение, архитектура которого основана MVC . Давайте начнем с примера каркаса:

Loading...Loading...