Насколько худыми должны быть контроллеры и насколько толстыми должны быть модели?

Насколько тонким должен быть контроллер? Я понимаю, что вся бизнес-логика помещается в модели, но как насчет других вещей?

Например, предположим, что я писал сайт блога, где каждый пользователь может иметь несколько сообщений. В настоящее время пользователь может создавать сообщения, посещая контроллер сообщений и выполняя действие create. Вот небольшой пример того, что произойдет в настоящее время.

class Controller_Post extends Controller {
  function action_create() {
    if ( ! empty($_POST)) {
        $post = new Model_Post;
        $post->user_id = $this->logged_in_user->id;
        $post->values($_POST);
        if ( ! $post->create()) {
            echo 'Error';
        }
        else
        {
            echo 'Saved';
        }
    }
  }
}

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

class Model_User extends Model {
function create_post($post) {
            $post = Model::factory('post')->values($post);
    $post->user_id = $this->id;
    if ( ! $post->create()) {
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}
}

Если бы это было сделано так, контроллер был бы даже меньше того, что я поставил. Для меня это имеет больше смысла, потому что пользователь - это тот, кто создает сообщение, поэтому я думаю, что это должно быть в пользовательской модели, а не в контроллере.

Если это поможет, я использую фреймворк Kohana.

Спасибо


person BDuelz    schedule 28.02.2011    source источник
comment
Я думаю, вы неправильно поняли. Большинство известных мне моделей худые, а в нашей бухгалтерии полно толстых контролеров: P   -  person jevakallio    schedule 01.03.2011
comment
ха-ха, смешно и верно. А если серьезно, мне любопытно, насколько тонким должен быть контроллер.   -  person BDuelz    schedule 01.03.2011
comment
В какой-то момент я обнаружил, что делаю толстые контроллеры только ради controller is the logic, теперь я убежден, что это не выход, модель имеет какую-то логику, а контроллер имеет логику другого типа. Я помещаю логику туда, где она мне удобнее, не заботясь о том, будет ли толстая модель или контроллер. Если ситуация требует толстой модели, меня устраивает. Мне очень нравится одежда zombor.   -  person Melsi    schedule 05.11.2011


Ответы (1)


Контроллеры должны направлять трафик. Модели предназначены для того, где идет ваша бизнес-логика, поэтому в общем ваш второй пример будет «правильным mvc».

По сути, контроллер должен запрашивать ввод, сообщать моделям об изменении состояния (они сами меняют фактическое состояние) и определять, какое представление отображать (если есть).

У меня много контроллеров, которые просто такие:

class Controller_Foobar extends Controller
{
    public function action_index() {}
}

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

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

person zombor    schedule 02.03.2011
comment
Если вам требуется манипулирование данными (например, подготовка метки времени из отдельных полей даты и времени), вы делаете это в контроллере или буквально просто передаете данные из POST в модель? - person BDuelz; 03.03.2011
comment
Это, вероятно, относится к модели. - person zombor; 03.03.2011