我正在学习Yii.我有一个测试开发,其中包含许多表(员工,个人详细信息,地址).我对MVC的理解使我几乎将它们视为独立的行星,其中每个(MVC)组件在该世界中都扮演着明确定义的角色.
我有一个问题开始困扰我,因为我现在想在这些世界之间传递数据和计算请求.我遇到了一些有关如何执行此操作的信息,但它们看起来更像是“骇客”,而不是“规定”的做法.我显然很热衷于不要养成不良习惯.这种过程显然是任何开发的根本要求,因此希望对此寻求一些指导.
一个具体的示例是返回对家庭薪水> $100,000,包括奖金(例如,员工控制员要求personalDetails控制器计算{工资薪金–税)并返回所有适当的实例,然后查找并返回相关员工).
因此,我应该在personalDetails中创建一个函数并从员工控制器内部调用它,还是应该在扩展中使用这种方法……还是有另一种方法?
非常感谢您的指导
解决方法:
对于封装的自管理视图部件,请使用widgets.对于上述情况,您可以创建具有可配置网格度的小部件.
如果您必须要求其他控制器来计算某些内容,那么这是一种不好的做法.而是将此类计算放在模型中.模型是高度可重用的,视图可以重用,但是控制器仅应响应动作并将数据绑定到视图.
胖模型,薄控制器,明智的看法.
这是一些草稿代码:
首先使用任何需要的计算创建模型:
class Employee extends CActiveRecord
{
public function getTotalSalary()
{
// Do any calculations here
// ...
return $salary;
}
}
然后,您可以在控制器中重用它:
class FirstController extends CController
{
public function actionPersonDetails()
{
$model = $this->_loadModel();
// By assigning this you will have getTotalSalary() available in view
$this->render('personDetails', ['model' => $model]);
}
}
class SecondController extends CController
{
public function actionViewSallary()
{
$model = $this->_loadModel();
// Also here you will have getTotalSalary() available in view
$this->render('viewSallary', ['model' => $model]);
}
}
对于需要一些独立的创建小部件的更复杂的场景:
class EmployeesWidget extends CWidget
{
public $minSalary = 0;
private $_data = null;
public function init()
{
$this->_data = new CActiveDataProvider(/* Criteria here with $this->minSalary as param */);
}
public function run()
{
$this->render('employeesWidget', ['data' => $this->_data]);
}
}
然后,您可以在任何视图中轻松使用它,甚至在其他小部件中:
$this->widget('path.to.EmployeesWidget', [
'minSallary' => 10000
]);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。