MVC, как его?
Июнь 25, 2008
MVC (Model-View-Controller) – это такой паттерн проектирования приложений. На использовании этого �?аблона базируются многие фреймворки, например Symfony для PHP, всем известные Smarty или Ruby on Rails для Ruby. В кратце, �?аблон MVC позволяет разделить данные, представление и обработку действий пользователя на три отдельных компонента
- Модель (Model). Модель предоставляет данные (обычно для View), а также реагирует на запросы (обычно от контролера ), изменяя свое состояние.
- Представление (View). Отвечает за отображение информации (пользовательский интерфейс).
- Поведение (Controller). �?нтерпретирует данные, введенные пользователем, и информирует модель и представление о необходимости соответствующей реакции.
Это многие знают, и понимают, но не всегда понятно как это использовать. Сейчас разберем простеий�?ий пример:
изначальный код:
<?php // Соединяемся с базой данных: $link = mysql_connect('localhost', 'myuser', 'mypassword'); mysql_select_db('blog_db', $link); // получаем данные $result = mysql_query('SELECT date, title FROM post', $link); ?> <html><head><title> Все сообщения </title></head> <body> <table> <tr><th> Дата </th><th> Заголовок </th></tr> <?php // вывод данных из базы в табличку while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "<tr>"; echo "<td> $row['date'] </td>\n"; echo "<td> $row['title'] </td>"; echo "</tr>"; } ?> </table> </body> </html> <?php // закрываем базу mysql_close($link); ?>
Вот вполне обычный код, который часто можно встретить во всяких гостевых книжечках. Но перед нами стоит задача переконвертировать этот код по MVC �?аблону. Зачем?
Затем
Такой код действительно легко писать, он быстро исполним, но его невозможно поддерживать или совер�?енствовать по причинам указанных ниже:
- Нет тут ни проверок на о�?ибки, ни перехватов исключений (а что если соединение с базой про�?ло неудачно?)
- HTML и PHP код переме�?аны в одном файле
- Этот код тесно связан с базой данных MySQL.
Этот код можно условно разделить на 2 части: работа с базой данных и формирование таблички.
Часть за которую отвечает контроллер
<?php
// это index.php
$link = mysql_connect('localhost', 'myuser', 'mypassword');
mysql_select_db('blog_db', $link);
$result = mysql_query('SELECT date, title FROM post', $link);
$posts = array();
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
$posts[] = $row;
}
mysql_close($link);
// вызываем вид
require('view.php');
?>
и часть за которую отвечает вид
<html>
<head>
<title> Все сообщения </title>
</head>
<body>
<h1>List of Posts</h1>
<table>
<tr><th>Date</th><th>Title</th></tr>
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post['date'] ?></td>
<td><?php echo $post['title'] ?></td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>
Вообще, было бы здорово следовать следующему правилу: чтобы «вид» был чистеньким, в нем должно использоваться минимально php-кода. Ведь вне�?ним видом обычно занимается дизайнер, который может быть и не знаком с php. Максимум можно использовать echo, if/endif, foreach/endforeach, и всё. А так же «вид» не может содержать php-код, который выводит html-тэги.
Вся же логика перемещается в скрипт контроллера, который не может содержать ничего кроме php-кода. Это связано с тем, что тот же самый контроллер может быть использован при представлении в pdf или XML варианте.
Полученный контроллер не совсем отвечает своему предназначению. Его бы тоже не ме�?ало разделить и переместить все независящее от запроса в файл модели model.php. Тогда это выглядело бы следующим образом:
<?php // это model.php function getAllPosts() { $link = mysql_connect('localhost', 'myuser', 'mypassword'); mysql_select_db('blog_db', $link); $result = mysql_query('SELECT date, title FROM post', $link); $posts = array(); while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { $posts[] = $row; } mysql_close($link); return $posts; } ?> а контроллер, находящийся в index.php вот так: <?php require_once('model.php'); $posts = getAllPosts(); require('view.php'); ?>
Таким образом мы выделили функциональную часть, управляющую часть и представление. В таком варианте этот код куда более читабельный, вносить новый функционал, дополняя новыми функциями model.php, использовать эти функции, вызывая их из контроллера, легко менять отображение на странице, т.к. для этого нужно изменить всего ли�?ь view.php. Хоть этот пример и очень прост, он вполне имеет право на существование. �?спользование �?аблона MVC в ва�?ем приложении действительно поможет вам его развивать в последствии.

Leave a Reply