从模型中需要模型中的功能。从控制器或型号打电话?

时间:2015-04-10 21:08:21

标签: php function oop

我的模型中有一个函数需要来自模型中另一个函数(生成)的信息。我应该从控制器还是模型中调用它?

从控制器调用生成

class Inventory extends Controller {

    function add_stock()
    {
        $generate = $this->model->generate(); //call generate from controller
        $this->model->current_stock($generate);
    }
}

class Model {
    public function current_stock($generate)
    {
        //do something with information from generate
    }

    public function generate()
    {
        //do something
        return
    }
}

OR

在模型中

class Inventory extends Controller {

    function add_stock()
    {
        $this->model->current_stock();
    }
}

class Model {
    public function current_stock()
    {
        $generate = $this->generate(); //call generate from model
        //do something with information from generate
    }

    public function generate()
    {
        //do something
        return
    }
}

两者都有效,但哪种解决方案最好?

请注意!这只是代码exemel并且可能包含错误,只是想说明我的意思。

3 个答案:

答案 0 :(得分:1)

问题在于这是否是模型中不存在的东西。

模型通常应该与控制器完全分离,因此能够独立存在(并且可以单独使用)。因此,如果这只是与模型相关的东西,它可能应该存在;如果它只是一个(在许多用例中),那么控制器可能更合适。

但考虑到你的例子

$generate = $this->model->generate(); //call generate from controller
$this->model->current_stock($generate);

如果你发现自己只在一些其他(=非自我)对象上操作并改变它的状态,那么让模型处理它通常会更好,因为如果你从外面做这件事,你经常会对内部工作做出假设对象。没有提到代码似乎没有意图揭示......正在生成什么?

因此我找到类似

的东西
$this->model->generate_current_stock();

更合适。 或者甚至完全隐藏它(如果它还没有生成,它将被生成)。

$this->model->current_stock();

答案 1 :(得分:0)

在这个用例中,我肯定会说后者。似乎generate()仅通过Model类操作,并且应该是私有方法(不是受保护或公共方法)。

本质上,第一个例子是访问(应该是)私有方法并复制该模型的逻辑。

$generate = $this->model->generate();

以上是冗余代码;这将越来越明显,您执行的验证越多。

答案 2 :(得分:0)

只需进行微小更改,现在您可以通过调用控制器中的$this->model->add_stock();来使用它。此外,您可以毫无问题地为每种方法编写测试;)

优点:

  1. 您可以为generate()方法编写测试
  2. 您可以使用模拟对象作为参数
  3. 编写current_stock()方法的测试
  4. 当编写前2个测试并测试功能时,您可以使用控制器$this->model->add_stock();方法而不必担心任何错误。
  5. 现在只需查看Contoller中的一行$this->model->add_stock();,我就知道这个方法的用途。我甚至不需要了解发电机或现有库存。

  6. class Inventory extends Controller
    {
        function add_stock()
        {
            $this->model->add_stock();
        }
    }
    

    class Model
    {
        public function current_stock($generate)
        {
            //do something with information from generate
        }
    
        public function generate()
        {
            //do something
            return;
        }
    
        function add_stock()
        {
            $generate = $this->generate();
            $this->current_stock($generate);
        }
    }