2

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

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

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

我曾经这样做(服务类的示例)

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 类将有多个实例,这是不必要的。

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

  • 将模型实例保存在服务的属性中
  • 在 Zend_Registry 中保留一个 Model 实例

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

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

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
    }
}
4

2 回答 2

1

从您的解释看来,您的服务类需要紧密耦合的模型。

在这种情况下,我认为不需要为您的模型公开一个公共 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);
    }
} 
于 2012-11-14T04:17:38.053 回答
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
    }
}    
于 2012-11-19T00:56:31.673 回答