Принадлежат ли условные операторы модели или контроллеру в php mvc? - PullRequest
3 голосов
/ 11 января 2012

Если вы используете mvc для создания профиля пользователя, было бы лучше использовать условные операторы для определения типа отображения комментариев внутри функции в модели или в контроллере, например:

Например У меня 3 класса

  • Комментарии
  • Участник
  • Администратор (расширяет член)

В некоторых примерах используется псевдокод, в котором отсутствуют функции

Вариант 1

В зависимости от типа пользователя, вошедшего в функцию showComments, при возврате комментариев будет возвращаться различная информация.

class user {

    function isLoggedIn() { //Check if a user is logged in }

    function getUserType() { // return user type }

    function showComments($id) { //comments code }
}

class admin extends user {
    function showComments($id) { //comments code }
}

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

$profileContent = $user->getOtherContent();

if ($user->isLoggedIn() && $user->getUserType() == "member") {
    $member = new member();
    $comments = $member->showComments($profileId);
}
elseif ($user->isLoggedIn() && $user->getUserType() == "admin") {
    $admin = new admin();
    $comments = $admin->showComments($profileId);
}
else
    $comments = $user->showComments($profileId);

require 'templates/profile.php';

Вариант 2

Поскольку это пользовательский каркас, я мог бы переместить все в функцию внутри модели и иметь одну функцию в пользователе, чтобы проверить тип комментария для отображения:

abstract class user {

    function isLoggedIn() { //Check if a user is logged in }

    function getUserType() { // return user type }

}

class profile {

    function showComments($profileId, $user) {

        if (User::isLoggedIn() && User::getUserType() == "member") {
            $comments = //database query and formatting for member
        }
        elseif (User::isLoggedIn() && User::getUserType() == "admin") {
            $comments = //database query and formatting for admin
        }
        else
           $comments = //database query and formatting for guest

        return $comments;
    }
}

Использование контроллера вроде:

$profile = new profile($profileId);
$comments = $profile->showComments();

require 'templates/profile.php';

Ответы [ 5 ]

5 голосов
/ 11 января 2012

Технически либо правильно.Шаблон MVC преднамеренно абстрактен, и есть некоторые споры о том, какова правильная область модели по сравнению с контроллером.

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

Обновление - в свете изменений в вашем вопросе я бы хотел немного адаптировать свой ответ:

Для варианта 1 было бы больше смыслачтобы спроектировать модель следующим образом:

class user {
    function isLoggedIn() {}
    function getUserType() {}
    function showComments() {}
}

class admin extends user {
    function getUserType() {}
    function showComments() {}
}

class member extends user {
    function getUserType() {}
    function showComments() {}
}

В контроллере экземпляр $ user должен быть создан как администратор, член или пользователь (это можно сделать с помощью статической фабрики или непосредственно в контроллере).После этого ваш контроллер просто

if ($user->isLoggedIn()) {
    $comments = $user->showComments($profileId);
}

(Чтобы сделать это еще умнее, profileId может быть установлен как свойство класса (если у пользователей нет нескольких профилей?)

Опция 2, otoh, эторазумное использование модели от модели к модели.

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

2 голосов
/ 17 января 2012

Полагаю, все зависит от вашей интерпретации того, что означает модель / вид / контроллер. Вот мои 2 цента:

Модель

Модель должна обрабатывать одну и только одну логику приложения. Если у вас есть модель User, то внутри этой модели должны быть только методы и атрибуты, относящиеся к User. Тем не менее, если возможно, постарайтесь не использовать логику комментариев внутри модели User. Они принадлежат модели комментариев. Создание условий, которые вызывают другую модель внутри текущей модели, будет переходом к другой части приложения. Для этого и нужны контроллеры.

Модели всегда должны отвечать абстрактными структурами. Модель никогда не должна отвечать чем-то отформатированным или основанным на строках. Обычно это должен быть массив, объект, простой тип int (предпочтительно константа модели) или логическое значение.

Контроллер

Контроллер должен обрабатывать входные данные (даже простое представление веб-страницы является входными данными), и на основе этих данных он должен вызывать логику приложения.

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

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

View

Вид - самый прямой из трех. Он должен иметь отформатированный ответ с простыми инструкциями, которые просто обрабатывают отображение (или в некоторых случаях сериализацию или преобразование ответа контроллеров в нечто, видимое другим приложением - браузером или третьим приложением, вызывающим API) *


Все сводится к тому, что вы задыхаетесь от архитектуры MVC. Старайтесь придерживаться постоянной «стратегии» развития на протяжении всего проекта.

Надеюсь, это поможет

2 голосов
/ 11 января 2012

Я пытаюсь переместить любую логику, которая обрабатывает данные (поиск, манипулирование и т. Д.) В модель. Иногда это включает условные утверждения.

Лично я бы сделал "showComments" и метод экземпляра для класса User, но это действительно вопрос мнения (также известный как "наилучшая практика" людьми с сильным мнением).

Я склонен придерживаться подхода Fat Model, Skinny Controller , когда это кажется разумным.

2 голосов
/ 11 января 2012

Я считаю, что это относится к модели.Я чувствую, что аутентификация и валидация пользователя - это то, что не принадлежит Контроллеру, в конечном итоге он работает с данными и проверяет их в MVC, что делается в Модели.Я думаю, что это хорошо подходит для контроллера по другой причине.Это делает это слишком умным.Контроллер должен знать только то, что ему нужно предоставить некоторые комментарии к представлению.Почему контроллеру необходимо знать, какой тип пользователя зарегистрирован?Он не должен, он должен знать только те данные, которые, как говорит Модель, должны быть.

1 голос
/ 15 января 2012

Бизнес логика принадлежит контроллерам.Логика данных принадлежит моделям.

Итак, если вам нужно показать определенные данные в зависимости от ввода пользователя, то они принадлежат контроллеру.Однако фактическое получение / хранение данных относится к модели.

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