Подтвердить что ты не робот

Понимание MVC: Какова концепция "Жира" на моделях "Skinny" на контроллерах?

Я пытаюсь понять концепцию "Fat" на моделях против "тощего" на контроллерах и из того, что я обсуждал, у меня есть следующий пример (это взято из обсуждения freenode):

Q: В парадигме MVC, его упомянутых моделях Fat, тощих контроллерах. Я здесь думаю: если у меня есть много методов (на контроллере), которые используют только несколько абстрактных методов для CRUD (на модели), создаю ли вместо этого модель контроллера жира? Или они говорят, толстая модель, носящая в том, что возвращается и не набирается? что-то я никогда не понимал =) Любые комментарии оцениваются! Большое спасибо

OBS1: Я не делаю то, что моделирует, в контроллере, у меня просто есть методы, которые управляют тем, что идет к модели

OBS2: скажем, "checkIfEmailExists()", имеет "[email protected]" в качестве параметров. Этот метод будет получать возврат из метода модели, который запрашивает, если этот параметр существует в таблице, возвращает boolean. Если равно 0, "checkIFemailExists()" вызовет другой метод модели, этот, он просто еще один абстрактный метод, который выполняет операцию обновления.

OBS3: "checkIfEmailExists()", это просто контроллер? Он на самом деле не выполняет какой-либо CRUD, он просто сравнивает ценности и т.д. Что меня пугает, потому что в моей голове это контроллер: S

Примечания: Я думаю, что это не лучший пример, так как "проверить, существует ли что-то", звучит как запрос моей операции таблицы

Q2: еще один вопрос, поэтому, допустим, у меня есть форма представления, откуда отправляется этот параметр адреса электронной почты. Вы говорите, что представление идет непосредственно к модели?

Q3: Не должен ли контроллер действовать между ними? это парадигма

ЗАКЛЮЧИТЕЛЬНОЕ ПРИМЕЧАНИЕ. Дискуссия закончилась, сказав, что я ошибаюсь, желание в порядке (я изучаю). Но, так, каковы правильные ответы для Q2 и Q3?

Спасибо за ваше внимание

4b9b3361

Ответ 1

Ваша заявка - M. Она должна быть независимой от V и C. V и C образуют пользовательский интерфейс для вашего приложения. Независимо от того, является ли это веб-интерфейсом или интерфейсом командной строки, для основной бизнес-логики вашего приложения не должно иметь значения. Вы хотите, чтобы модель была жирной с бизнес-логикой.

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

Упрощенный пример

public function fooAction()
{
    if(isset($_POST['bar'])) {
        $bar = Sanitizer::sanitize($_POST['bar']);
        $rows = $this->database->query('SELECT * from table');
        try {
            foreach($rows as $row) {
                $row->foo = $bar;
                $row->save();
            }
        } catch (Exception $e) {
            $this->render('errorPage');
            exit;
        }
        $this->render('successPage');
    } else {
        $this->render('fooPage');
    }
}

Когда это должно быть

public function fooAction()
{
    if(isset($_POST['bar'])) {
        $success = $this->tableGateway->updateFoo($_GET['bar']);
        $page    = $success ? 'successPage' : 'errorPage';
        $this->render($page);
    } else {
        $this->render('fooPage');
    }
}

потому что все контроллеры должны знать. Он не должен обновлять строки. Он должен просто сказать модели, что кто-то запросил это изменение. За обновление отвечает класс, управляющий строками. Кроме того, контроллер не обязательно должен дезинфицировать значение.

Что касается Q2 и Q3, см. мой ответ на Могу ли я вызвать модель из представления.

Ответ 2

Я давно работаю с парадигмой MVC, и я могу поделиться с вами своим опытом.

Часть "model" отвечает за обработку всего материала, который не является строго "веб-сайтом", например проверки, логики, доступа к данным и т.д. Подумайте об этом как о смешанном уровне бизнес-уровня + доступа к данным. Вы также можете иметь BLL + DAL в отдельных сборках и использовать часть "Модель" MVC в качестве моста между вашим BLL и вашим приложением, а также добавлять классы, характерные для приложения MVC, и не относящиеся к BLL, такие как классы ViewData, и т.д.

Часть "контроллер" - это то, что заботится о веб-специфических материалах, таких как аутентификация, файлы cookie, GET и POST, querystrings и т.д. Он использует материал, присутствующий в модели и/или BLL, и отправляет данные, которые имеют для отображения пользователю.

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

Надеюсь, это устранит некоторые из ваших сомнений.

Ответ 3

Я всегда интерпретировал это как означающее, что модели должны инкапсулировать логику, связанную с этими моделями, в более объектно-ориентированный подход, в отличие от того, чтобы вся логика в контроллерах использовалась в более процедурном подходе. Процитировать Собор и базар:

Интеллектуальные структуры данных и немой код работают намного лучше, чем наоборот.

Ответ 4

Я могу показать свое смещение (в сторону С#), но я не думаю, что имеет смысл говорить о MVC, если вы не используете стиль объектно-ориентированного программирования. Контроллер не является методом, он представляет собой набор методов, сгруппированных в класс, каждый из которых обрабатывает некоторый ввод (url/request). Модель не является способом доступа к базе данных (это уровень доступа к данным), это набор свойств и методов, которые инкапсулируют какой-либо идентифицируемый объект в ваше приложение: лицо, оговорку, продукт и т.д. Лучший способ подумайте о том, что контроллеры обрабатывают ввод, модели содержат данные - но, конечно, это упрощено.

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

Ответ 5

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

Хорошим примером такого разделения является:

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