在Zend_Registry和类属性中存储数据

时间:2012-11-13 23:27:58

标签: model-view-controller zend-framework

我正在构建一个Zend Framework应用程序,其中Model层分为Services和Models。控制器动作调用服务方法,而服务方法又调用模型方法。

例如:LanguagesController :: addAction()检查表单是否已提交且有效。如果是这样,它将表单数据传递给Service_Language :: add(),其中在调用Model_Language :: add()之前将一些业务逻辑应用于数据,这有效地将记录添加到数据库。

这意味着大多数控制器操作都需要服务类的实例,服务类中的大多数方法都需要模型类的实例。

我曾经这样做过(Service类的例子)

class Service_Language
{
    public function add()
    {
        $languageModel = new Model_Language;

        // perform some business logic and add record
    }

    public function edit()
    {
        $languageModel = new Model_Language;

        // perform some business logic and edit record
    }

    public function delete()
    {
        $languageModel = new Model_Language;

        // perform some business logic and delete record
    }
}

它不仅变得麻烦,在控制器操作调用多个Service方法的更复杂的应用程序中,将会有同一Model类的多个实例,这是不必要的。

一位同事告诉我要研究两种选择:

  • 将Model实例保留在Service
  • 的属性中
  • 在Zend_Registry中保留一个Model实例

我认为最好的解决方案是第一个选择。原因是Zend_Registry充当全球容器。我们不希望我们的模型实例在我们的Controller操作中可用,这是糟糕的架构。你对此有何看法?

第一个选项可以按如下方式实施:

class Service_Language
{

    protected $_model = null;

    function setModel()
    {
        $this->_model = new Model_Language();
    }

    function getModel()
    {
        if($this->_model == null)
        {
            $this->setModel();
        }

        return $this->_model;
    }
    public function add()
    {
        $languageModel = $this->getModel();

        // perform some business logic and add
    }
}

2 个答案:

答案 0 :(得分:0)

根据您的解释,听起来您的服务类需要紧密耦合的模型。

在这种情况下,我认为公共的公共getter / setter是不必要的 - 你是否真的需要为服务设置另一个模型呢?

在这种情况下,将模型分配给属性是有道理的 - 为什么不在构造函数中执行此操作?

class Service_Language
{
    protected $_model = null;

    public function __construct()
    {
        $this->_model = new Model_Language();
    }

    public function add()
    {
        // perform some business logic and add
        $this->_model->add($data);
    }

    public function edit()
    {
        // perform some business logic and add
        $this->_model->edit($data);
    }
} 

答案 1 :(得分:0)

构造函数本来是一个不错的选择,但并不是服务层中的每个方法都需要有一个模型实例来完成它的工作,所以我最终这样做了。我对OOP编程比较陌生,所以我想知道这是不是一个好的解决方案。任何想法都非常受欢迎。

class Service_Language
{

    protected $_model = null;

    protected function setModel()
    {
        $this->_model = new Model_Language();
    }

    protected function getModel()
    {
        if($this->_model == null)
        {
            $this->setModel();
        }

        return $this->_model;
    }

    // Function where model is needed
    public function add($data)
    {
        // Perform some business logic

        $this->getModel()->add($data);

        // return something
    }

    // Function where no model is needed
    public function add($data)
    {
        // Perform some business logic

        // return something
    }
}