MVC фреймворк
Создана: 23 Июня 2012 Суб 23:24:24.
Раздел: "Компьютерный раздел"
Сообщений в теме: 14, просмотров: 1328
-
Пусть стоит задача перед нами - получить данные от сервера http, обработать и создать отчеты.
Пишем систему на php. Для работы с БД будем использовать расширение PHP Data Objects (PDO)
Слово фреймворк означает модель. Весь код приложения делится на три части по функциональности - model (логическая часть), controller (интерфейс между частями приложения) и view (представление).
В качестве строительных элементов приложения будем использовать классы. Это удобно и является развитием процедурного стиля программирования.
Я буду использовать как основу, системы описанные в этих статьях
[внешняя ссылка]
[внешняя ссылка]
Для начала я установил на компьютер http-сервер Apache 2.2, php 5.3.13 и mysql 5.5
Далее несколько раз прочитал обе статьи, ознакомился с кодом фреймворка, который скачал по ссылке [внешняя ссылка] -
-
Ссылки в php
Не сталкивался раньше, можно передавать переменные в пользовательскую функцию по ссылке,
если нужно разрешить функции модифицировать свои аргументы.
Такой код даст вывод - '4545route'
Код: <?php
$controller='4545';
getController($controller);
echo $controller;
function getController(&$controller)
{
$controller .= 'route';
}
?>
А такой - '4545'
Код: <?php
$controller='4545';
getController($controller);
echo $controller;
function getController($controller)
{
$controller .= 'route';
}
?> -
Ключевую роль в MVC играет класс Controller.
Класс Router принимает запрос, извлекает из него имя нужного контроллера , его метод , передаваемый методу список аргументов и отправляет на исполнение классу Controller
Класс Controller подключает модель обработки данных и затем обработанные данные отправляет нужному классу View , для отображения результата -
В MVC одна точка входа в приложение. В корень папки сайта помещают файл index.php , который решает что делать с содержимым запроса. Получателем запроса является какой-то метод объекта контроллер. И этот метод в общем случае нуждается в аргументах
Чтобы обеспечить всю необходимую для запуска метода информацию в запрос обычно помещают переменную route, которая состоит из строк разделенных прямым слэшем
Например, в папке controllers/cont_1/cont_11 лежит файл Controller_db.php , в котором определен класс Controller_db, имеющий метод controller_link и требующий 2-х аргументов строковых
Тогда переменная $route будет иметь такое значение : controllers/cont_1/cont_11/Controller_db/controller_link/root/erbol
Необходима процедура которая бы выбирала из этой строки нужные данные и выстраивала бы путь от корневой папки сайта к файлу контроллера. После определения пути надо использовать процедуру которая запускает указанный метод контроллера и передает ему аргументы -
MVC это совокупность классов рассортированных по функциональности на три части.
Неудобством при использовании множества файлов является необходимость их присоединения к исполняющемуся скрипту с помощью операций include или require. Чтобы избежать этого можно определить функцию автозагрузки классов.
Допустим все классы находятся в одной папке, назовем ее classes.
Код: function __autoload($class_name)
{
$filename = strtolower($class_name) . '.php';
$file = site_path . 'classes' . DIRSEP . $filename;
if (!file_exists($file))
{
return false;
}
include ($file);
}
После того как мы вставили в программу эту функцию она будет вызываться автоматически всякий раз когда в коде будет встречаться ссылка на имя класса, требующая его определения -
В MVC про точки входа ничего нет, есть разделение приложения на 3 слоя, всё остальное - просто фичи, не связанные с MVC.karaganda писал : В MVC одна точка входа в приложение. В корень папки сайта помещают файл index.php , который решает что делать с содержимым запроса. Получателем запроса является какой-то метод объекта контроллер. И этот метод в общем случае нуждается в аргументах
Самое главное в MVC - не писать SQL и HTML в PHP-классах. SQL выносится или в query builder, или в отдельный класс/классы только с SQL, а в остальном коде идёт лишь использование методов этих классов (например, UserDB::getActiveUsers()), а весь HTML выносится в шаблоны. Естественно, это упрощённое изложение, и в реальных проектах возникает много трудностей куда выделить тот или иной код. Идея MVC предлагает разделять код, отвечающий за данные (описание модели, связи и т.д.), бизнес-логику (проверка доступа, логирование и т.д.) и представление (HTML это или PDF) держать раздельно.
Понятно, что MVC-фреймворки не всегда представляют этот паттерн в чистом виде, где-то модель разделена на описание и репозиторий данных, где-то модель связана непосредственно с видом и т.д. -
Вот, я на эту статью ссылался в предыдущих сообщениях
[внешняя ссылка]
Цитата:
Одной из важных вещей в MVC является одна точка входа в приложение вместо кучи PHP-файлов
-
MVC - паттерн глобальный, используется не только в скриптовых языках типа PHP, Python, но и в Java и C#, поэтому говорить о каких-то специфических для языка вещах, вкладывая это в MVC не стоит, иначе можно нормальный MVC на нескольких точках входа (а в Symfony2, например, разные точки входа - на разные окружения и конфигурации из веба и ещё одна из консоли) принять за не-MVC.
Но опять же, "эталонного" MVC в природе не существует, вместе с ним приходят и другие хорошие практики. -
В системе состоящей из множества файлов и использующей классы возникает проблема доступа к переменным класса.
Есть несколько подходов к решению этой проблемы. Можно объявить нужные переменные класса публичными. Но это противоречит принципу инкапсуляции
Можно создать класс для обмена данными между классами.
Многие используют функции __set и __get
Вот пример
[внешняя ссылка] -
Cуть MVC состоит в разделении приложения на три отдельные компоненты таким образом, что модификация каждого из них оказывает минимальное воздействие на остальные. Это приводит к существенному облегчению процесса разработки и поддержки.
Взаимоотношения между контроллером и моделью.
Контроллер встречает клиентский запрос, разбирает его на элементы, инициализирует объекты модели. После обработки данных моделью, он принимает её ответ и отправляет его на уровень представления.
Пусть контроллер имеет метод index, который принимает данные и отправляет их в модель на обработку. Контроллер на основании запроса принимает решение о том какие данные нужны получить от модели и куда их отправить для отображения, какому классу шаблонов из View
Модель — это образ реальности, из которой взято только то, что нужно для решения задачи. Модель концентрируется на логике решения основной задачи. Многие называют это бизнес-логикой, на ней лежит большая ответственность:
1. Сохранение, удаление, обновление данных приложения. Это реализуется через операции с базой данных или через вызов внешних веб-сервисов.
2. Инкапсуляция всей логики приложения. Абсолютно вся логика приложения без исключений должна быть сконцентрирована в модели. Не нужно какую-то часть бизнес-логики выносить в контроллер или представление.
[внешняя ссылка]
[внешняя ссылка] -
Составил схему наподобие того как это сделано в статье
[внешняя ссылка]
Только у меня весь код для работы с БД находился в классе Контроллера. Для работы с БД использовал расширение PHP - класс PDO.
После того как прочитал статью [внешняя ссылка] о том, что классы Данных представляют из себя сущности операций над данными подумал о том что взаимоотношения с БД состоят из нескольких повторяющихся действий
1. Соединение с БД
2. Запись строки в таблицу аудита
3. Проверка условия на выполнение операции с помощью запроса на выборку к таблице терминалов
4. Если условие истинно то добавляем запись в таблицу операций и в таблицу аудита
5. Если условие ложно то добавляем запись в таблицу аудита