我正在构建一个 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
}
}