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 - так что выбирай )

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

Что теперь делать?

  • Модель должна сохранять данные из Контроллера.
  • Отображению нужен Контроллер для получения данных.
  • Контроллеру нужно Отображение для ввода данных.
  • Модель должна эти данные куда-то сохранять.

Вот простой способ дальнейшей разработки:

  1. Создать слои с дизайном HTML/CSS.
  2. Разделить их на три части:
    1. слой - структура
    2. общие данные для большинства страниц:
      • низ (footer)
      • место для рекламы/логотипа/слогана
    3. изменяющиеся данные:
      • навигация
      • заголовок
      • мета-теги
  3. Создать контроллер, снова соединяющий все воедино
  4. Получать и выводить данные из форм и БД…

Отображения

Пример простого отображения для сайта.

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

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Welcome extends CI_Controller {

  function __construct()
  {
    parent::__construct();
    $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);
  }
}

/* End of file welcome.php */
/* Location: ./application/controllers/welcome.php */

Можно заметить, что я использовал в массиве $data вызов навигационного отображения - так мы подгружаем одно в другое. Загрузка вьювера с параметром true возвращает код назад Управлению.

Так же ключ 'content' пуст (это мы поправим :)) Если вы сейчас запустите тест, то загрузится страница с h1 тегом “Welcome”, названием «Test Application» и блоком навигации.

Модель

Для получения ссылок из бд создадим модель:

application/models/Links.php (большая буква ‘L’ !)

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

//большая L !
class Links extends CI_Model {

  function get_links() {
   $query = $this->db->get('links'); //то же самое, что и Select * from links
   return $query->result();
  }
}

/* End of file Links.php */
/* Location: ./application/models/Links.php */

Эта модель представляет одну функцию - 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. Надеюсь, ты на этом не остановишься и пойдешь далее, совершенствуя код и постигая истину. =)

Источник — «http://code-igniter.ru/wiki/MVC»
Личные инструменты