Шаблон MVC: что нужно создать в первую очередь? - PullRequest
9 голосов
/ 12 февраля 2012

Я изучаю CodeIgniter и его шаблоны программного обеспечения.Что должно быть создано первым: представление или контроллер?

Ответы [ 8 ]

13 голосов
/ 12 февраля 2012

Модель , потому что это ваше приложение. Контроллер и вид образуют только один интерфейс к модели. Можно сказать, контроллер - это дверь в ваш дом. Что вы строите первым? Дверь или дом? Правильно, поэтому сначала соберите модель. Затем добавьте интерфейс к нему.

7 голосов
/ 12 февраля 2012

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

  1. Создание HTML-шаблона с помощью CSS / изображения и т. Д.
  2. В зависимости от того, какие данные отображаются в представлении, я создаю методы контроллера.
  3. Я помещаю фиктивные данные в методы контроллерачтобы я мог видеть динамическую страницу, которая правильно управляет представлением.
  4. В соответствии с данными, которые нужны моему контроллеру, я создаю метод Model.

В этом процессе я никогда не создаю никакого дополнительного методаили блок кода.Это предотвращает добавление кода, который мы обычно считаем «необходимым».Но они никогда не нужны.

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

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

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

Хорошо написанный, тестируемый контроллер должен принимать представление как зависимость, введенную с помощью метода __construct контроллера. Однако я не знаю, позволяют ли контроллеры CodeIgniter использовать эту функцию.

В парадигме MVC Контроллер «объединяет» элементы Представления и Модели, поэтому, как и любая поведенческая зависимость, если эти объекты предоставляют какую-либо функциональность помимо «тупого» хранения данных, они должны быть внедрены в ваш контроллер при время создания экземпляров, чтобы их можно было смоделировать для целей тестирования. Итак, вы бы сделали что-то вроде следующего:

$view  = new SmartyView;
$model = new UserModel;
$controller = new LoginController($view, $model);

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

class LoginController
{
  protected $view;

  public function __construct(ViewInterface $view)
  {
    $this->view = $view;
  }
  public function doLogin($user, $pass)
  {
    $userModel = new UserModel();
    // do stuff with model to determine if user/pass was valid
  }
}

$view  = new SmartyView;
$controller = new LoginController($view);

Для обеспечения возможности тестирования рекомендуется избегать тесной связи ваших контроллеров с вашими представлениями и моделями. Вот почему вы должны избегать использования ключевого слова new внутри кода вашего контроллера. Ваш контроллер - и любой другой объект, в этом отношении - должен ASK для его зависимостей, а не LOOK для них. Это приведет к более прозрачным API, более тестируемому коду, меньшему количеству хлопот отладки и сделает вас счастливее.

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

Контроллер является обязательным. Потому что вы не можете выполнить / выполнить работу без контроллера. Таким образом, контроллер стоит первым из-за следующего

  1. При необходимости вы можете отключить просмотр
  2. Вы можете установить соответствующие переменные для вида через контроллер
  3. Взаимодействие с моделью осуществляется контроллером, поэтому, когда вам требуются данные, контроллер приходит первым
  4. Вы можете перенаправить пользователя на другой контроллер
  5. Вы можете отобразить другое представление на основе запроса. Для компьютеров вид A, а для мобильных устройств вид B, как мудрый
  6. Просмотр - это презентация, поэтому сначала вам нужно представить данные.
0 голосов
/ 27 января 2017

Я знаю, что это может быть старый вопрос, но я столкнулся с ним сейчас.
А кому-то еще это может понадобиться позже. Поэтому я решил подвести итог.
Я думаю, что ваш подход будет зависеть от ситуации.
Пусть порядок операций, которые вы делаете, будет таким Model-View-Controller
И давайте назовем его Bottom -To-Top подход. Обоснование и обоснование этого приводится @Gordon here .
И еще один случай, назовем его Сверху вниз , когда вы начинаете с пользовательского интерфейса. Обоснование и обоснование этого приведены в @ shiplu.mokadd.im здесь .
Оцените собственный случай и выберите один из них. Удачи!

0 голосов
/ 12 февраля 2012

Я бы сказал, модель и контроллер рука об руку.

Без модели, как вы узнаете, какой будет поток в контроллере?

Без контроллера, как вы узнаете, какие методы нужны в модели?

Иногда модель получает приоритет, иногда контроллер в зависимости от ситуации.

0 голосов
/ 12 февраля 2012

Вы должны начать с Controller, поскольку он вызывает View.

Здесь вы можете видеть, что контроллер является промежуточным звеном между моделью и представлением. http://codeigniter.com/user_guide/overview/mvc.html

0 голосов
/ 12 февраля 2012

Контроллер, он нужен вам для связи между моделью и представлением. Без контроллера модель не может взаимодействовать с представлением.

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