Насколько сложными должны быть модели? - PullRequest
5 голосов
/ 10 июля 2011

При реализации моделей с использованием шаблона MVC, насколько сложными должны быть мои модели?

Допустим, у меня есть несколько таблиц, таких как:

  • Пользователь (идентификатор, пароль, создан ...)
  • электронные письма (user_id, email ...)
  • Адреса (user_id, address ...)

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

<!-- language: php -->
class UserController{

    public function create($array){
        ...
    }

    public function login($email, $password){
        ...
    }
}

Должны ли мои модели быть очень примитивными, реализуя только операции CRUD через ORM? Это приведет к коду вроде:

<!-- language: php -->
class UserController{

    public function create($array){
        $userModel->username = 'blah';
        $userModel->blah = 'blah';
        $id = $userModel->save();

        $emailModel->id = $id;
        $emailModel->email = "emailhere";
        $emailModel->save();

        //Do the same for addresses
    }

    public function login($email, $password){
        ...
    }
}

Или, в качестве альтернативы, у меня могут быть более сложные модели:

<!-- language: php -->
UserModel{
    public function login($email, $password){
        //Do the joining and checking here, then return true or false to the controller
    }
}

Тогда в моем контроллере:

<!-- language: php -->
userModel->login($mail, $password);

Итак, какой путь лучше? Чтобы собрать всю логику в модели, или я должен иметь модели, выполняющие только основные операции CRUD? Наконец, как мне работать с объединениями таблиц? Должны ли они иметь дело с моделью или с контроллером?

Приветствия

Ответы [ 2 ]

3 голосов
/ 10 июля 2011

Большинство людей думают о парадигме «Толстые модели, тощие контроллеры», и в долгосрочной перспективе она работает лучше.

Хорошее правило - думать о своих моделях как о своей собственной сущности, вчувствую, что если вы перенесете свои модели, например, в другую среду, они все равно будут функционировать.

Простым примером будет сохранение информации о заказе на веб-сайте электронной коммерции.Допустим, вы хотите сохранить информацию о налоге, а именно, сколько налога на заказ.Абстрактный способ сделать это ...

$tax_amount = $order_amount * (TAX_PERCENTAGE / 100);

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

Однако, если бы мы рассчитывали налог в нашей модели заказа, мы бы сделали это один раз, чтобы сохранить() метод, который вызывается при редактировании и добавлении заказов.

public function save() {
    //calculate tax first
    $q = $this->db->query($sql);
}

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

РЕДАКТИРОВАТЬ:

Применяя это к конкретному вопросу, который вы задали, подумайте, понадобится ли вам когда-нибудь метод login() где-нибудь еще, кроме вашей модели User?Возможно, вы захотите разделить свои модели на более конкретные.Но в этом случае вы можете расширить свою модель пользователя.

Как насчет того, чтобы полностью убрать контроллер?Или, если вы хотите взаимодействовать с вашими моделями совершенно по-другому (скажем, через другую платформу в будущем).Думая таким образом, вам было бы гораздо лучше использовать метод входа в вашу модель User.

Лично я бы создал метод входа в систему для моей модели, потому что это операция с данными, и это то, что наши моделидля.Я также хотел бы создать метод loginAction() на моем контроллере, который будет запускать метод login() в нашей модели и выполнять любое другое действие (например, журнал неудачных попыток / перенаправление), которое должно произойти напост-логин, должен ли он быть успешным или неудачным.Пример loginAction() может выглядеть следующим образом ...

class UserController extends GenericController {
    public function loginAction() {
        $post = $this->form->getPost();
        if(UserModel::login($post)) {
            //do something
        } else {
            //do something else
        }
    }
}
0 голосов
/ 10 июля 2011

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

Я думаю, вам нужна дополнительная модель для авторизации и / или текущих параметров системы. AuthModel может хранить информацию о различных ролях авторизации, а SysModel хранит параметры приложения, такие как настройки входа в систему по умолчанию (например, использовать куки да или нет).

Тогда метод входа может быть размещен в AuthModel, что, по моему мнению, должно быть хорошим местом. Также модели отвечают за проверку введенных данных, поэтому создание новых пользователей должно быть в UserModel.

...