MVC: какой код принадлежит модели - PullRequest
2 голосов
/ 26 февраля 2012

Я начал разработку проекта CakePHP с нескольких недель. С самого начала я боролся с количеством кода внутри контроллеров. Контроллеры в большинстве случаев содержат больше строк кода, чем модели. Зная выражение «Тощий контроллер, толстая модель», я уже несколько дней ищу способ добавить больше кода в модели.

В этот момент возникает вопрос: «где провести черту». Что должен делать контроллер и что должна делать модель. Уже есть несколько вопросов / ответов, только я ищу более практическое объяснение. Например, я поместил функцию ниже, которая теперь находится внутри контроллера. Я думаю, что часть этого кода должна и может быть перенесена в модель. Поэтому мой вопрос: какую часть я могу переместить в модель, а какую можно оставить в контроллере.

/**
* Save the newly added contacts and family members.
*/
public function complete_contacts()
{
    if ($this->request->is('post')) {
        if (isset($this->data['FamilyMembers'])) { 

            $selected_user = $this->Session->read('selected_user');

            $family_members = $this->data['FamilyMembers'];

            $this->ContactsConnection->create();
            foreach ($family_members as $family_member) { 
                // connection from current user to new user
                $family_member['ContactsConnection']['contact_family_member_id'] = $selected_user['id'];
                $family_member['ContactsConnection']['nickname'] = $selected_user['first_name'];
                $this->ContactsConnection->saveAll($family_member);

                // inverted connection from new user to current user
                $inverted_connection['ContactsConnection']['family_member_id'] = $selected_user['id'];
                $inverted_connection['ContactsConnection']['contact_family_member_id'] = $this->FamilyMember->inserted_id;
                $inverted_connection['ContactsConnection']['nickname'] = $family_member['FamilyMember']['nickname'];
                $this->ContactsConnection->saveAll($inverted_connection);
            } 
        }
    }
}

Должен ли я создать функцию в модели FamilyMember с именем: "save_new_family_member ($ family_member, $ selected_user)"?

Ответы [ 2 ]

2 голосов
/ 26 февраля 2012

Что касается целей М и С

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

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

Я бы предложил вам пройти

    $selected_user = $this->Session->read('selected_user');

Для вашей модели и выполнить для каждого внутри вашей модели. Возможно, вы захотите изменить правила относительно того, как хранятся данные, или выполнить какие-либо преобразования в них, и Контроллер должен игнорировать это. В основном, используйте контроллер для передачи вашей информации [из представления часто] в модель. Не манипулируйте моделью напрямую из контроллера. Короче ДА создайте предложенную вами функцию:)

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

1 голос
/ 27 февраля 2012

Вы делаете это правильно.

Вы, конечно, можете создать несколько методов в модели и сделать их жирными с помощью:

function updateContactFamilyMemberId($id){}
function updateNickname($nickname){}
...

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

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