не получилась MVC(или её бледное подобие)

Духовность™

Продвинутый новичок
не получилась MVC(или её бледное подобие)

Решил тут попробовать по паттерну MVC сделать пару скриптов. Попробовать так сказать. Вкратце это так выглядело на примере скрипта редактирования пользователей и редактирования статей. Покажу на примере редактирования пользоватлей:

Файл users.php - "исполняемый" скрипт PHP. Он оперирует классами:

- class.user.php - это модель, умеет только вставлять и возвращать записи
- class.userEditController.php - код ниже
- представление делать не стал - отдавал нужные данные прямо в users.php и там php-native все делал.

Загвоздка случилась с т.н. контроллером. У меня такое впечатление, что я не совсем верно понял идею MVC в контексте ООП.
Вот какой контроллер у меня получился:

PHP:
class userEditController
{
    //...
    
    // Основной и единственнный метод, который выполняет основную обязанность скрипта - либо обновляет, 
    // либо создает нового пользователя
    public function doAction()
    {
        if (isset($_POST['submit']))
        {
            $this->validate();
            
            if (!$this->err)
            {
                if (!$this->id_user)
                {
                    $this->user = new newUser($_POST);
                }
                else
                {
                    $this->user->update($_POST);
                }
            }
            
            return true;
        }
        
        return false;
    }
    
    private function validate()
    {
        if (empty($_POST['name']))
        {
            $this->err[] = 'Ошибочка вышла!';
        }
    }
    
    //...
}
в скрипте users.php примерно это:

PHP:
// ...

// Фактически это сингализирует о POST-запросе
if ($userController->doAction())
{
    if ($err = $userController->getErr())
    {
        // ошибки отдаются переменным шаблона
    }
    else
    {
        // получаем ИД пользователя
        $id_user = $userController->getUser()->getId();
        
        if (IS_EDIT)
        {
            // Данные пользователя успешно изменены
        }
        else
        {
            // Пользователь успешно добавлен в систему
        }
        
        header('Location: ...');
    }
}
по сути получилось "что-то не так". Возникли вопросы:

1. Контроллер userEditController используется ТОЛЬКО В ЭТОМ СКРИПТЕ. Присобачить его к аналогичному, но немного отличающемуся скрипту редактирования пользоватлей во фронтенеде (когда пользователи сами себя правят) НЕ ПОЛУЧИЛОСЬ - слишком разные требования. Вывода два сделал - либо для подобного действия во фронтенде надо писать собственный контроллер (к чему больше склоняюсь), либо я лох.

2. Какой смысл в этом контроллере, если это можно сделать структурным подходом? Скрыть реализацию проверок заполнения полей и самиих действий?

3. В правильном ли направлении я вообще пошел?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
«Первым признаком того, что код требует рефакторинга является избыточное количество конструкций условного ветвления.» © Мартин Фаулер.

Твой «класс» плохо спроектирован. Точнее, он вообще не спроектирован, и не класс в его идеологическом понимании.

-~{}~ 16.09.08 18:02:

«Рефакторинг Replace Conditional Dispatcher with Command описывает, как разбить большой оператор выбора вариантов на набор объектов Command, каждый из которых может быть найден и вызван без использования при этом условной логики.»

-~{}~ 16.09.08 18:05:

Самая большая ошибка, с моей точки зрения —
// Основной и единственнный метод, который выполняет основную обязанность скрипта - либо обновляет,
// либо создает нового пользователя
Такого метода быть не должно, в принципе. Публичных методов должно быть НЕ МЕНЬШЕ! чем разных actions у контроллера.
 

Духовность™

Продвинутый новичок
флоппик
вот хорошо, вплотную подошли к точки моего непонимания: контроллер пишется исключительно для определенного действия или контроллер - это обобщение, который должен содержать много методов, выполняющих разные действия? Вот на примере скрипта редактирования пользователей - как контроллер схематично должен выглядеть? Он должен уметь что делать? Только редактировать пользователей или также их удалять, к примеру?



Фаулера сегодня куплю, да.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Вика говорит что:

Шаблон MVC позволяет разделить данные, представление и обработку действий пользователя на три отдельных компонента:
* Модель (Model). Модель предоставляет данные (обычно для View), а также реагирует на запросы (обычно от контролера ), изменяя свое состояние.
* Представление (View). Отвечает за отображение информации (пользовательский интерфейс).
* Поведение (Controller). Интерпретирует данные, введенные пользователем, и информирует модель и представление о необходимости соответствующей реакции.

Как ты это реализуешь в коде — другой вопрос. Будет у тебя ресколько разных классов, реализующих контроллер или один, имеющий много методов, для реализации каждого действия этого контроллера... Я немного некорректно выражаясь, утрируя, но общая мысль такая.

-~{}~ 16.09.08 18:28:

редактировать пользователей или также их удалять
Это должна уметь делать модель, а не контроллер.

-~{}~ 16.09.08 18:34:

http://chtivo.webhost.ru/articles/mvc.php
 

Духовность™

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

-~{}~ 16.09.08 15:39:

http://chtivo.webhost.ru/articles/mvc.php
так я по этому примеру и писал! один в один почти!
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Надо не писать по примеру, а читать, что написано. И даже нарисованно )
запросы то через него все равно идут
Не. В том то и суть. У тебя есть модель, которая умеет методы Edit, Delete.
У тебя есть контроллер, который смотрит твой юзер-инпут, делает Validate, и если все хорошо, то и говорит модели — а сделай-ка ты мне Delete, c воооот таким параметром!
(если все плохо, то говорит View, мол, отобрази этому балбесу, что у нас все плохо)

А у тебя контроллер пытается сам сделать и Delete, и Edit...
 

Духовность™

Продвинутый новичок
флоппик
Понятно. но не понятно что я не так сделал.

У тебя есть контроллер, который смотрит твой юзер-инпут, делает Validate, и если все хорошо, то и говорит модели — а сделай-ка ты мне Delete, c воооот таким параметром!
так чем мой код

PHP:
    public function doAction()
    {
        if (isset($_POST['submit']))
        {
            $this->validate();
            
            if (!$this->err)
            {
                if (!$this->id_user)
                {
                    $this->user = new newUser($_POST);
                }
                else
                {
                    $this->user->update($_POST);
                }
            }
            
            return true;
        }
        
        return false;
    }
не подходит под твое определение я не пойму?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Я не говорил, что не подходит. Просто ты сделал
Как ты это реализуешь в коде — другой вопрос. Будет у тебя несколько разных классов, реализующих разные контроллеры...
И, закономерно, получил
1. Контроллер userEditController используется ТОЛЬКО В ЭТОМ СКРИПТЕ.
А почему у тебя
Присобачить его к аналогичному, но немного отличающемуся скрипту редактирования пользоватлей во фронтенеде (когда пользователи сами себя правят) НЕ ПОЛУЧИЛОСЬ
Другой уже вопрос. Значит, плохо построил абстракцию, плохо спроектировал.
Какой смысл в этом контроллере, если это можно сделать структурным подходом?
Как я уже говорил, это ошибочное мнение, что для MVC (как и для других паттернов) обязательно нужен ООП.
 
Сверху