MVC
Материал из Wiki
Содержание |
Введение
Метод Model-View-Controller (Модель-Отображение-Контроллер, MVC) — это способ объединить три базовые функции современного ядра сайта:
- Функции работы с БД (CRUD)
- Программная логика и обработка запросов
- Отображение (HTML)
Эти три элемента и есть в модели MVC:
- Model - работа с базой данных, файловыми хранилищами и другими источниками данных.
- Controller - логика.
- View - разметка страницы.
Некоторые правила
При программировании с MVC следует соблюдать некоторые правила.
Не стоит этого делать
Views:
- Никогда не обращаться к БД напрямую
- Не использовать никакой логики, кроме циклов и условных операторов (если-то-иначе)
Controllers:
- Никогда не использовать HTML
- Не работать с БД напрямую
Models:
- Не работать с HTML
Делай это
Views:
- Поддерживай модульность — разбивай всё на составные части.
- Используй только простые циклы и сравнения.
Controllers:
- Обрабатывай информацию между моделью и отображением.
- Передавай данные на вывод в Отображение.
- Определяй правила фильтрации данных.
- Используй модели для получения/сохранения данных.
- Обрабатывай все ошибки.
Models:
- Используй самую простую логику работы с базой.
- Все ошибки передавай контроллеру.
- Реализуй хотя бы минимальную проверку данных.
Создание приложения
База данных
Начнем с таблицы ‘links’(ссылки) в БД сайта. Нам нужны следующие поля:
id - autoincrement - индекс
link_title - varchar(50) - заголовок
link_url - varchar(255) - ссылка
Добавь пару тестовых записей.
Создай пользователя БД. Избегай работы с аккаунтом ‘root’ (суперадминистратором), так как это порой небезопасно.
Настройка БД в Code Igniter
Установив CI, открой файл system/application/config/database.php и поправь эти строки:
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "username"; //не используй root
$db['default']['password'] = "password";
$db['default']['database'] = "database";
$db['default']['dbdriver'] = "mysql"; //CI поддерживает даже Oracle - так что выбирай )
Советуем записать базу данных в автозагрузку, что бы потом не заморачиваться с настройками.
Что теперь делать?
- Модель должна сохранять данные из Контроллера.
- Отображению нужен Контроллер для получения данных.
- Контроллеру нужно Отображение для ввода данных.
- Модель должна эти данные куда-то сохранять.
Вот простой способ дальнейшей разработки:
- Создать слои с дизайном HTML/CSS.
- Разделить их на три части:
- слой - структура
- общие данные для большинства страниц:
- низ (footer)
- место для рекламы/логотипа/слогана
- изменяющиеся данные:
- навигация
- заголовок
- мета-теги
- Создать контроллер, снова соединяющий все воедино
- Получать и выводить данные из форм и БД…
Отображения
Пример простого отображения для сайта.
application/views/layout/main.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title><?= $title ?></title>
</head>
<body>
<h1><?= $current_page ?></h1>
<div><?= $navigation ?></div>
<div><?= $content ?></div>
</body>
</html>
Тут есть четыре переменные: title - заголовок страницы current_page - тег с именем страницы navigation - блок навигации content - блок с кодом для вывода данных
application/views/navigation/nav_main.php
<ul id="navigation">
<li><?= anchor("","Home") ?></li>
<li><?= anchor("links","Links") ?></li>
</ul>
Тут используется хелпер URL для создания ссылок.
Ну, и контент:
application/views/content/link_list.php
<?php foreach($links as $link): ?>
<p><?= anchor($link->link_url,$link->link_title) ?><?= anchor('edit/'.$link->id,"Edit") ?></p>
<?php endforeach; ?>
Контроллер
Создадим Контроллер для соединения этого всего:
application/controllers/welcome.php
//function Welcome() (php4, для php5 ниже)
function __construct()
{
parent::Controller();
$this->load->helper('url');
}
function index()
{
$data = array(
'title' => 'Test Application',
'current_page' => 'Welcome',
'navigation' => $this->load->view('navigation/nav_main','',true),
'content' => ''
);
$this->load->view('layout/main',$data);
}
Можно заметить, что я использовал в массиве $data вызов навигационного отображения - так мы подгружаем одно в другое. Загрузка вьювера с параметром true возвращает код назад Управлению.
Так же ключ 'content' пуст (это мы поправим :)) Если вы сейчас запустите тест, то загрузится страница с h1 тегом “Welcome”, названием «Test Application» и блоком навигации.
Модель
Для получения ссылок из бд создадим модель:
application/models/Links.php (большая буква ‘L’ !)
<?php
//большая L !
class Links extends Model {
function Links() {
parent::Model();
}
function get_links() {
$query = $this->db->get('links'); //то же самое, что и as Select * from links
return $query->result();
}
}
?>
Эта модель представляет одну функцию - get_links -для получения списка ссылок из базы..
Теперь поправим Контроллер:
application/controllers/welcome.php
function index()
{
$this->load->model('links');
$links['links'] = $this->links->get_links();
$data = array(
'title' => 'Test Application',
'current_page' => 'Welcome',
'navigation' => $this->load->view('navigation/nav_main','',true),
'content' => $this->load->view('content/link_list',$links,true)
);
$this->load->view('layout/main',$data);
}
Тут мы поместили ссылки в массив $links[‘links’]. В то же время мы передаем этот массив в $data[‘content’].
Но если вы обновите теперь тестовую страницу, то увидите ссылки из базы данных!
Заключение
Вот мы и создали простой сайт с технологией MVC. Надеюсь, ты на этом не остановишься и пойдешь далее, совершенствуя код и постигая истину. =)