Yii - грань между моделями и контроллерами - какие методы где?Принципы MVC - PullRequest
2 голосов
/ 09 марта 2011

в Yii, допустим, у меня есть таблица Employee и таблица Company. Компания имеет много Emlpoyee. Сотрудник принадлежит компании.

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

$form->dropDownList($model, 'company_id', CHtml::listData(Company::model()->findAll(),'id', 'company')

Но я собираюсь иметь много таких в каждой форме (относящихся к разным моделям), поэтому я думаю о том, чтобы добавить такую ​​функциональность в их собственные методы - что-то вроде $ model-> getCompanies () .

Мой вопрос: где лучшее место для этого метода?

Должно ли оно идти в модели компании? С точки зрения, я хотел бы получить к нему доступ как

Company::model()->getCompanies()

Должен ли он идти в модели станции? Это на самом деле не имеет смысла для меня, так как мне кажется, что я бы «спросил» компанию, но тогда мой код представления будет:

$model->getCompanies()

Или, наконец, я должен поместить метод getCompanies () в модель Company, а затем вызвать этот метод из actionCreate () StationsController и отправить результат в render () для представления?

Какой самый логичный путь с точки зрения MVC?

Ответы [ 3 ]

2 голосов
/ 09 марта 2011

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

Кстати, если вы просто хотите получить список компаний, вам не нужно создавать новуюфункции, просто сделайте Company :: model () -> findAll ()

1 голос
/ 09 марта 2011

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

0 голосов
/ 10 марта 2011

Похоже, вы все делаете правильно.Если вас беспокоит необходимость вызывать Company :: model () -> findAll () снова и снова, просто сделайте это один раз в контроллере ($ companies = Company :: model () -> findAll ()) и передайте $ companies всмотреть с render (), как вы делаете с $ model.Затем используйте $ companies в представлении.

Я согласен с парадигмой "тощие контроллеры, толстые модели" по большей части, но я делаю еще одну вещь в своих контроллерах (помимо маршрутизации): готовим переменные для использования ввид.Это то, что вы делаете, когда загружаете модель $ из строки $ _GET в конце концов.Поэтому иногда я буду готовить дополнительные переменные, в данном случае $ companies.

...