Как далеко должна зайти модель в программировании MVC? - PullRequest
3 голосов
/ 05 марта 2012

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

Как далеко должна идти модель?

Если у меня есть массив:

array( 'first_name' => 'Thomas', 'second_name' => 'Clayson', 'email' => 'thomas@email.com' );

И вот запрос mysql, который мне нужно получить:

INSERT INTO `users` (`name`, `email`) VALUES ("Thomas Clayson", "thomas@email.com");

Как должна выглядеть моя модель?

Возьмите необработанные данные и отформатируйте их соответствующим образом

public function insertUser($details){
    if(!isset($details['first_name']) || !isset($details['second_name']) || !isset($details['email'])){
        return false;
    }

    $full_name = $details['first_name']." ".$details['second_name'];
    $email = $details['email'];

    $query = "INSERT INTO `users` (`name`, `email`) VALUES ('".$full_name."', '".$email."')";
}

Оставьте форматирование на контроллере и просто возьмите ввод и вставьте его вслепую в db

public function insertUser($full_name = false, $email = false){
    if(!$full_name || !$email){
        return false;
    }

    $query = "INSERT INTO `users` (`name`, `email`) VALUES ('".$full_name."', '".$email."')";
}

Что-то еще?

Моя проблема в том, что у меня многоданных для помещения в таблицу, поэтому я не хочу, чтобы каждое поле было отдельным аргументом функции.Но потом я чувствую, что введение массива информации в модель требует от меня проверки каждого индекса и соответствующего форматирования в любом случае, поэтому нет особого смысла делать это и в контроллере.Похоже, вдвое больше работы.

Но опять же, это не правильно делать и в модели!

Так что же делают другие люди?

PSВопрос основан на (но ни в коем случае не ограничивается) структурой codeigniter.

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Вот и мы снова ...

Модель в MVC не класс . Это слой, который содержит объекты с двумя видами ответственности:

  • бизнес-логика домена
  • доступ к данным и их хранение

Бизнес-объекты домена не должны иметь никакого представления о том, откуда поступают данные или где они хранятся. Это означает, что в объектах домена нет SQL, поскольку вполне возможно, что нет даже базы данных, и вся информация поступает в некоторый удаленный REST API.

Если вы используете базу данных, SQL окажется в DAO (обычно реализует datamapper ).

И форматирование не является обязанностью ни объектов домена, ни объектов доступа к данным, ни даже контроллеров.

Форматирование должно происходить в представлениях, которые являются полноценными объектами в MVC, а не в некоторых анемичных шаблонах. Представление отвечает за логику представления. Он запрашивает у уровня модели домена, что ему нужно.

Вы действительно должны посмотреть, что такое MVC Model2 и чем она отличается от MVP.

0 голосов
/ 05 марта 2012

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

Ваша модель должна соответствовать тому, что находится в вашем слое персистентности, и в идеале вы должны использовать ORM под вашими моделями. Это отвлекает вас от использования определенной логики поставщиков баз данных и в некоторой степени отвлекает вас от беспокойства по поводу написания SQL-запросов и т. Д.

Например, с помощью Doctrine (PHP ORM) вы можете передать большую часть своей фильтрации и проверки в ORM с помощью аннотаций. Это то же самое для многих ОРМ, например, Hibernate для Java.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...