Yii - 模型和控制器之间的界限 - 哪些方法在哪里? MVC原则

时间:2011-03-09 06:06:03

标签: php model-view-controller yii models

在Yii中,假设我有一个Employee表和一个Company表。一家公司有很多Emlpoyee。一个Emloyee属于一家公司。

在创建新员工的表单中,我想提取所有存在公司的列表并将其放入下拉列表中。我知道我可以这样做:

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

但是我会在每种形式中都有很多这些(与不同的模型有关),所以我想把这种功能放在他们自己的方法中 - 比如$ model-> getCompanies( )。

我的问题是,这种方法的最佳位置在哪里?

是否应该采用公司模式?从视图中,我将访问它:

Company::model()->getCompanies()

它应该进入Station模型吗?这对我来说真的没有意义,因为它似乎是我会'问'公司的东西,但那时我的查看代码将是:

$model->getCompanies()

或者最后,我应该将getCompanies()方法放在Company模型中,然后从StationsController的actionCreate()调用该方法,并将结果发送到视图的render()吗?

从MVC的角度来看,最合乎逻辑的方式是什么?

3 个答案:

答案 0 :(得分:2)

逻辑上所有这些都在公司活动记录中。 获取公司列表正在处理Company表中的数据。 由于活动记录的目的是对与该特定表相关的所有功能进行分组,因此该功能应该在那里。

顺便说一下,如果你只想要一个你不需要创建新功能的公司列表,那就做一个 公司::模型() - >的findAll()

答案 1 :(得分:1)

规则是“瘦的控制器,胖模型”。将大部分代码放在模型中。控制器应该简单并且路由请求

答案 2 :(得分:0)

看起来你做得对。如果您担心反复调用Company :: model() - > findAll(),只需在控制器中执行一次($ companies = Company :: model() - > findAll())并传递$ companies使用render()进入视图,就像使用$ model一样。然后在视图中使用$ companies。

我同意大多数情况下的“瘦控制器,胖模型”范例,但我在控制器中做了一件额外的事情(除了路由):准备在视图中使用的变量。这就是你在$ _GET字符串中加载$ model之后所做的事情。所以有时候我会准备额外的变量,在这种情况下是$ companies。