微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP-在控制器之间传递值

我正在学习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 举报,一经查实,本站将立刻删除。

相关推荐