Как работает MVC controller?

Добрый день, не совсем понимаю, как работает mvc, в частности в yii. Вопрос такой - контроллер создается для каждого запроса отдельно или один запрашивающий получает тот же самый контроллер, что и другой запрашивающий?

Для уточнения - допустим у меня есть контроллер с 2 экшенами и некими параметрами, допустим так (псевдокод):
controller myController
{
  private param = 5;

  action action1
  {
    this->param = 9;
    this->render(this->param);
  }
  action action2
  {
    this->render(this->param);
  }
}

так вот, если один пользователь запросит экшен1, а второй пользователь после этого запросит экшен2 - не может ли он получить значение "9"?
  • Вопрос задан
  • 1892 просмотра
Решения вопроса 3
ppokrovsky
@ppokrovsky
Ответственность контроллера в MVC:
1. Получение параметров из представления (GET/POST итд) и передача их в модель
2. Возврат представления с параметрами, полученными из модели
3. Валидация и фильтрация параметров в обе стороны
4. Контроль доступа на основании правил, заложенных в модели

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

Общее правило: тонкий контроллер и толстая модель.

. Вопрос такой - контроллер создается для каждого запроса отдельно или один запрашивающий получает тот же самый контроллер, что и другой запрашивающий?


Специфика веб-приложений в том, что на каждый запрос клиента создается новый экземпляр приложения, так как HTTP(S) - протокол без сохранения состояния (stateless).
Для всех клиентов существует один общий класс контроллера (class myController), но на каждый запрос каждый клиент получает собственный экземпляр контроллера (new myController)

если один пользователь запросит экшен1, а второй пользователь после этого запросит экшен2 - не может ли он получить значение "9"?


нет, второй пользователь получит 5, так как взаимодействует с собственным экземпляром контроллера.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
1) контроллер - это медиатор (посредник) между view и model, кроме как связывать эти два компонента он ничего не должен делать, все делегируется в эти два слоя
2) все контроллеры должны быть stateless - то есть никаких сохранений параметров и прочего.
3) каждый "экшен" контроллера должен быть независимым.
Ответ написан
mainameiz
@mainameiz
Full-stack web-developer
Все зависит от того как работает ваше приложение/сервер/фреймворк. Если он на каждый запрос создает новый экземпляр контроллера тогда переменные между клиентами не передаются (и скорее всего так и есть)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы