ФорумПрограммированиеPHP для идиотовPHP и ООП → и опять MVC...

и опять MVC...

  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 21 июля 2008 г. 11:53

    знаю что тема заезжаная до ж, но всё-таки

    Никак до меня не дойдёт смысл последней буквы в этой абревиатуре. Я вроде всегда отделяю логику от представления. С одной стороны - абстракция над БД, ФС и др. "источниками данных" (Model), с противоположной - шаблоны (View). Между ними сценарий, который обрабатывает запрос клиента, берет информацию из Model и запихивает её во View. Вопрос - это что, и есть "controller"? Тогда может его можно как-то по-умному организовать? Пока думаю сделать так: для каждого модуля свой контролер (класс) со своими функциями (методами этого класса). Типа того:
    abstract class Controller 
    {
    }

    class NewsController extends Controller
    {
    public function show() { … }
    public function append() { … }
    }

    class ArticleController extends Controller
    {
    public function order() { … }
    public function show() { … }
    }

    Вот только непонятно мне - как это поможет перенести код из одного проекта в другой. Ведь получается, что все три части этого "mvc" всё равно придется писать каждый раз заново. Я уже в конец запутался вообщем…

    Кто-нибудь использовал CakePHP, Symfony и т. п. вещи? Стоит их использовать, есть ли реальные преимущества, какие впечатления, короче?

    Просто пытаюсь заварганить себе что-то типа "фрейморка", что бы был очень простой каркас на который можно будет быстро и безболезненно надевать небольшие проекты. Вот думаю, стоит ли изобретать велосипед или всё-таки взять готовый.
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 21 июля 2008 г. 12:22, спустя 28 минут 26 секунд

    Вопрос - это что, и есть "controller"?

    да, он может просто запихивать ее во вью а можен накладывать еще какую-то логику

    ак это поможет перенести код из одного проекта в другой

    логика остаеться таже а DBAL (data base abstract layer) у тебя поменялся с adodb на peardb
    и шаблонизатор поменялся со смарти на хтемплейт

  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 21 июля 2008 г. 15:17, спустя 2 часа 55 минут 18 секунд

    Я тоже думаю, а не попробывать ли мне CakePHP или Symfony… Так, просто, ради интереса))
    adw/0
  • Patrick

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 21 июля 2008 г. 15:27, спустя 9 минут 18 секунд

    Вот только непонятно мне - как это поможет перенести код из одного проекта в другой.

    ну а что у тебя изменится в статьях/новостях, кроме шаблона в другом проекте?
  • Sinkler

    Сообщения: 9655 Репутация: N Группа: в ухо

    Spritz 21 июля 2008 г. 23:33, спустя 8 часов 6 минут 25 секунд


    получается, что все три части этого "mvc" всё равно придется писать каждый раз заново

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

    как это поможет перенести код из одного проекта в другой

    допустим, ты написал класс для проверки введеных пользователем данных. т.к. класс используется по всему скрипту удобнее вынести его в отдельный файл, например validate.class.php, и подключать при необходимости. в следующем скрипте ты просто возьмешь созданный класс и начнешь использовать его. в этом прелесть ооп.
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 21 июля 2008 г. 23:40, спустя 7 минут 16 секунд

    ну а что у тебя изменится в статьях/новостях, кроме шаблона в другом проекте?

    хм, да ну вобщем-то ничего особого не изменится…

    допустим, ты написал класс для проверки введеных пользователем данных. т.к. класс используется по всему скрипту удобнее вынести его в отдельный файл, например validate.class.php, и подключать при необходимости. в следующем скрипте ты просто возьмешь созданный класс и начнешь использовать его. в этом прелесть ооп.

    Речь немного не об этом. Всмпомогательные библиотеки имеются в наличии и используются постоянно.

    Я наверное слишком много хочу - в идеале, иметь такой каркас, что бы оставалось только сделать структуру БД и разверстать шаблоны :)
  • Sinkler

    Сообщения: 9655 Репутация: N Группа: в ухо

    Spritz 22 июля 2008 г. 2:32, спустя 2 часа 51 минуту 27 секунд

    а я бы забил БД сразу…
  • Patrick

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 22 июля 2008 г. 3:06, спустя 34 минуты

    Я наверное слишком много хочу - в идеале, иметь такой каркас, что бы оставалось только сделать структуру БД и разверстать шаблоны :)

    угу многовато! хотя посмотри на Symfony….

  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 22 июля 2008 г. 13:36, спустя 10 часов 30 минут 14 секунд


    Я тоже думаю, а не попробывать ли мне CakePHP или Symfony… Так, просто, ради интереса))


    Я в даный момент пишу проект на Симфони, изначально я его не взлюбил за то что он плохо документирован.
    Зато потом когда недельку посидел за докой и когда все стало ясно, то мне этот фреймворк оч понравился, реально подумываю о том чтоб перейти на него полностью.

    Еще в планах попробовать Зенд, говорят тоже неплохая штука
  • Lirck

    Сообщения: ? Репутация: N Группа: Джедаи

    Spritz 22 июля 2008 г. 14:38, спустя 1 час 2 минуты 7 секунд

    Я наверное слишком много хочу - в идеале, иметь такой каркас, что бы оставалось только сделать структуру БД и разверстать шаблоны :)

    Это уже CMS =)
  • killich

    Сообщения: 270 Репутация: N Группа: Адекваты

    Spritz 1 августа 2008 г. 12:50, спустя 9 дней 22 часа 11 минут

    я вообще нахрен ушл от классов. чистая функционалка. обработчики событий. Главное не классы, а устройство приложения. Подглядел кой что на рельсах руби. то что щас у меня получается на пхп во многом похоже на рельсы тока актив рекорда у меня нет
    Рубист с большой буквы Г. Серый кардинал кулинарного блога open-cook.ru
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 1 августа 2008 г. 13:18, спустя 28 минут 30 секунд

    killich, классы руль!
  • sap

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 1 августа 2008 г. 13:48, спустя 29 минут 24 секунды

    Вообще не представляю, как работать без классов.
  • killich

    Сообщения: 270 Репутация: N Группа: Адекваты

    Spritz 1 августа 2008 г. 14:01, спустя 12 минут 53 секунды

    А ООП на ассемблере слабо? Ха! Не говорите что это невозможно! Дима Билан же взял Евро.
    А теперь к вопросу о МВЦ.
    Рубист с большой буквы Г. Серый кардинал кулинарного блога open-cook.ru
  • killich

    Сообщения: 270 Репутация: N Группа: Адекваты

    Spritz 1 августа 2008 г. 14:02, спустя 57 секунд

    Что такое 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
    &quot;.__Publications.&quot;.Pub_Time < &#39;$time_to&#39;
    LIMIT 1
    &quot;;
    $res= db_query($quary);
    $res= res2array($res);
    if(isset($res[0][&#39;id&#39;])) return true;
    return false;
    }

    Где-нибудь Вы видите проверку на корректность данных? Функции PHP? Да нет их тут – Модель это то, что только обращается к БД. Модель нафиг не должна знать ничего о пришедших параметрах. Все данные пришедшие в Модель уже должны быть безопасными и корректными. Все что здесь есть – это SQL, его выполнение – возвращение результата. ВСЕ!

    Смотрим какой-нибудь мой контроллер:


    // Модель подключаем
    require_once (NEWS_MODEL.&#39;news_functs.php&#39;);

    function news_funct($args){
    // ПОЛУЧЕНИЕ АРГУМЕНТОВ ИЗ КОМАНДНОЙ СТРОКИ
    $news_from= get($args, &#39;news_from&#39;, 0);
    $news_from= natural_number($news_from);

    $news_y= get($args, &#39;news_y&#39;, 0);
    $news_m= get($args, &#39;news_m&#39;, 0);
    $news_d= get($args, &#39;news_d&#39;, 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(
    &#39;news&#39;=>$news,
    &#39;news_y&#39;=>$news_y,
    &#39;news_m&#39;=>$news_m,
    &#39;news_d&#39;=>$news_d
    );
    }


    Видите здесь какие-нибудь SQL? А функции вывода на экран ECHO, PRINT или HTML вставки. Как не видите?! О блин! Фига се и вправду нет! А НЕХЕР им ТуТа ДЕЛАТЬ! ЭТО ЛОГИКА. К Логике подключается Модель и функции модели вызываются логикой в зависимости от необходимости.

    Смотрим Вид:
    (Извините без отбивки)

    <?php
    $_news= get($args, &#39;news_preview&#39;);
    if(is_array($_news) &amp;&amp; sizeof($_news)>0){
    foreach($_news as $n=>$news){
    $_date= date2arr(unix2date($news[&#39;pub_time&#39;]));
    ?>
    <tr>
    <td><img src=&quot;<?php echo NEWS_VIEW ?>pic/li_arr.gif&quot; /></td>
    <td><span><?php echo &quot;{$_date[&#39;d&#39;]}.{$_date[&#39;m&#39;]}.{$_date[&#39;y&#39;]}&quot; ?></span></td>
    <td>
    <?php
    if(empty($news[&#39;header&#39;])) $news[&#39;header&#39;]= UNDEFINED_NEWS_NAME;
    echo alink(READ_NEWS.$news[&#39;id&#39;], $news[&#39;header&#39;]);
    ?>
    </td>
    </tr>
    <?php
    }//foreach
    }else{
    ?>
    <tr>
    <td><img src=&quot;<?php echo NEWS_VIEW ?>pic/li_arr.gif&quot; /></td>
    <td><span class=&quot;hide&quot;>– – –</span></td>
    <td><a href=&quot;#&quot;>Отсутствует список последних опубликованных новостей</a></td>
    </tr>
    <?php
    }
    ?>

    Суть в том, что модель кинула нам в вид массив $args. Вы попробовали выдернуть из этого массива данные которые могли бы отрисовать. Если такие данные есть то рисуем табличку с данными. Если нет – то и рисовать не будем.

    Есть ли тут Логика? Да ЕСТЬ! Но логика не ПОЛУЧЕНИЯ ДАННЫХ, а ЛОГИКА ОТРИСОВКИ. ЭТО ДВЕ РАЗНЫЕ И НЕСОПОСТАВИМЫЕ ВЕЩИ.
    Есть ли обращение к БД? Нет! Функции проверки данных? Нет! Только то, что нужно, что бы из пришедших, уже готовых данных что-то нарисовать.
    Надоело как выглядит лента новостей?! Что ТЫ БУДЕШЬ МЕНЯТЬ???? ЛОГИКУ? МОДЕЛЬ? НЕТ! ВИД! И сделаешь ты это очень быстро!

    Захотел нарисовать в виде что то новое? Тогда парень готовься и Логику поменять и Модель доработать, что б новые данные получить и передать их в Вид. Работать все равно придется!

    А теперь момент! Если ты пишешь на РУБИ на Рельсах, то там уже заготовка приложения разбита на составляющие, только одно но –там не нужно выносить SQL в отдельный файл, т.к. там в контроллере (Логике) можно вызывать функции ActivRecord, которые сами за тебя сделают SQL. Что значительно упрощает жизнь.

    Рубист с большой буквы Г. Серый кардинал кулинарного блога open-cook.ru

Пожалуйста, авторизуйтесь, чтобы написать комментарий!