1

我正在学习 Yii。我有一个测试开发,其中包含许多表(员工、个人详细信息、地址)。我对 MVC 的理解使我将这些几乎视为单独的行星,其中每个 (MVC) 组件在该世界中扮演着明确定义的角色。

我有一个问题开始困扰我,因为我现在想在这些世界之间传递数据和计算请求。我遇到了一些关于如何做到这一点的帖子,但它们看起来更像是“黑客”而不是“规定”的做法。我显然不想养成坏习惯。这种过程显然是任何开发的根本要求,因此想就此寻求一些指导。

一个具体的例子是返回一个包含奖金的员工的视图,这些员工的薪水> 100,000美元(例如,员工控制器要求personalDetails控制器计算{goss薪水+奖金-税}并返回所有适当的实例,然后查找并返回相关员工)。

那么我应该在personalDetails中创建一个函数并从员工控制器内部调用它,还是应该在扩展中进行这种事情......还是有另一种方法?

感谢您对此的指导

4

1 回答 1

4

对于封装的自我管理视图部件,请使用小部件。对于上述情况,您可以创建具有可配置阈值的小部件。

如果您必须要求不同的控制器来计算某些东西,这是一种不好的做法。将此类计算放在模型中。模型是高度可重用的,视图可以重用,但是控制器应该只响应动作并将数据绑定到视图。

胖模型瘦控制器,明智的观点。

这是一些草稿代码:

首先使用任何需要的计算创建模型:

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
]);
于 2013-09-27T11:31:11.223 回答