Что такое MVC? И зачем нужны все три буквы? Позволь на примере попробую объяснить мое виденье этой штуки.
Когда я начинал втыкать в эту тему мой Гуру тыкал меня носом и твердил одну фразу – когда ж ты сволочь определишься что ты хочешь от M, что от V , что от С? Сволочь пришла в конце концов к банальному и очень простому выводу:
M – обращение и работа с БД.
V – отрисовка данных.
С –
1. обработка аргументов пришедших в приложение
2. получение данных их M по той логике, которую требуют пришедшие аргументы
3. преобразование к удобоваримому для V виду и их отправка в V.
Смотрим сюда:
Вот пример M:
function news_preview($news_count){
$quary="
SELECT
".__Publications.".Id as id,
".__Publications.".Header as header,
".__Publications.".Description as descriptor,
".__Publications.".Pub_Time as pub_time
FROM ".__Publications."
WHERE
".__Publications.".Show = '1'
ORDER BY Pub_Time DESC
LIMIT 0, $news_count
";
$res= db_query($quary);
$res= res2array($res);
if(sizeof($res)>0) return $res;
return NULL;
}
function news_exists($time_from= '', $time_to= ''){
$quary="
SELECT
".__Publications.".Id as id
FROM ".__Publications."
WHERE
".__Publications.".Show= 1 AND
".__Publications.".Pub_Time > '$time_from' AND
".__Publications.".Pub_Time < '$time_to'
LIMIT 1
";
$res= db_query($quary);
$res= res2array($res);
if(isset($res[0]['id'])) return true;
return false;
}
Где-нибудь Вы видите проверку на корректность данных? Функции PHP? Да нет их тут – Модель это то, что только обращается к БД. Модель нафиг не должна знать ничего о пришедших параметрах. Все данные пришедшие в Модель уже должны быть безопасными и корректными. Все что здесь есть – это SQL, его выполнение – возвращение результата. ВСЕ!
Смотрим какой-нибудь мой контроллер:
// Модель подключаем
require_once (NEWS_MODEL.'news_functs.php');
function news_funct($args){
// ПОЛУЧЕНИЕ АРГУМЕНТОВ ИЗ КОМАНДНОЙ СТРОКИ
$news_from= get($args, 'news_from', 0);
$news_from= natural_number($news_from);
$news_y= get($args, 'news_y', 0);
$news_m= get($args, 'news_m', 0);
$news_d= get($args, 'news_d', 0);
// ПРОВЕРКА ДАННЫХ НА КОРРЕКТНОСТЬ
$news_from= natural_number($news_from);
$news_y= natural_number($news_y);
$news_m= natural_number($news_m);
$news_d= natural_number($news_d);
// ВСЯКИЕ ТАМ ПРЕОБРАЗОВАНИЯ ДАННЫХ
$today= date2arr(unix2date(time()));
$from= time();
$to= time();
//Если Месяц не установлен - то новости за весь нынешний год
if($news_m==0){
ЛОГИКА И ВСЯКАЯ ПРОЧАЯ ЧУШЬ
}
// Список новостей получить из БД
$news= news_list($from, $to, $news_from, NEWS_ON_PAGE);
// ВСЕ УДОБОВАРИМЫЕ ДЛЯ VIEW ДАННЫЕ КИДАЕМ В ОТРИСОВКУ
return array(
'news'=>$news,
'news_y'=>$news_y,
'news_m'=>$news_m,
'news_d'=>$news_d
);
}
Видите здесь какие-нибудь SQL? А функции вывода на экран ECHO, PRINT или HTML вставки. Как не видите?! О блин! Фига се и вправду нет! А НЕХЕР им ТуТа ДЕЛАТЬ! ЭТО ЛОГИКА. К Логике подключается Модель и функции модели вызываются логикой в зависимости от необходимости.
Смотрим Вид:
(Извините без отбивки)
<?php
$_news= get($args, 'news_preview');
if(is_array($_news) && sizeof($_news)>0){
foreach($_news as $n=>$news){
$_date= date2arr(unix2date($news['pub_time']));
?>
<tr>
<td><img src="<?php echo NEWS_VIEW ?>pic/li_arr.gif" /></td>
<td><span><?php echo "{$_date['d']}.{$_date['m']}.{$_date['y']}" ?></span></td>
<td>
<?php
if(empty($news['header'])) $news['header']= UNDEFINED_NEWS_NAME;
echo alink(READ_NEWS.$news['id'], $news['header']);
?>
</td>
</tr>
<?php
}//foreach
}else{
?>
<tr>
<td><img src="<?php echo NEWS_VIEW ?>pic/li_arr.gif" /></td>
<td><span class="hide">– – –</span></td>
<td><a href="#">Отсутствует список последних опубликованных новостей</a></td>
</tr>
<?php
}
?>
Суть в том, что модель кинула нам в вид массив $args. Вы попробовали выдернуть из этого массива данные которые могли бы отрисовать. Если такие данные есть то рисуем табличку с данными. Если нет – то и рисовать не будем.
Есть ли тут Логика? Да ЕСТЬ! Но логика не ПОЛУЧЕНИЯ ДАННЫХ, а ЛОГИКА ОТРИСОВКИ. ЭТО ДВЕ РАЗНЫЕ И НЕСОПОСТАВИМЫЕ ВЕЩИ.
Есть ли обращение к БД? Нет! Функции проверки данных? Нет! Только то, что нужно, что бы из пришедших, уже готовых данных что-то нарисовать.
Надоело как выглядит лента новостей?! Что ТЫ БУДЕШЬ МЕНЯТЬ???? ЛОГИКУ? МОДЕЛЬ? НЕТ! ВИД! И сделаешь ты это очень быстро!
Захотел нарисовать в виде что то новое? Тогда парень готовься и Логику поменять и Модель доработать, что б новые данные получить и передать их в Вид. Работать все равно придется!
А теперь момент! Если ты пишешь на РУБИ на Рельсах, то там уже заготовка приложения разбита на составляющие, только одно но –там не нужно выносить SQL в отдельный файл, т.к. там в контроллере (Логике) можно вызывать функции ActivRecord, которые сами за тебя сделают SQL. Что значительно упрощает жизнь.
Рубист с большой буквы Г. Серый кардинал кулинарного блога open-cook.ru