Насколько стройными должны быть контроллеры, и какими жирными должны быть модели? - PullRequest
3 голосов
/ 01 марта 2011

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

Например, скажем, я писал блог-сайт, где у каждого пользователя может быть несколько постов.В настоящее время пользователь может создавать сообщения, посещая контроллер сообщений и выполняя действие 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.

Спасибо

1 Ответ

4 голосов
/ 02 марта 2011

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

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

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

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

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

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

...