3

我正在使用 zend 框架,这是我的模型和控制器方法的框架

Model Class methods :
_validateRegisterForm($postData)
{
//validating data using Zend_Filter_Input
//Returns instance of Zend_Filter_Input
}

//Return true/false
protected _isNumberAlreadyExists()
{
  // I dnt want to perform above validation using zend_validate_db_recordexists
  //since i dnt want to mix my dblogic with in buisness logic
}
register($postData)
{
  $input=$this->_validateRegisterForm($postData);

  if(!$input->isValid())
  {
   //What should it return to controller
  }
  if(!$this->_isNumberAlreadyExists($input->number))
  {
    //What should it return to controller
  }
}

controller class api

$this->_model->register($postData)

我希望在以下条件下以相同的格式将错误返回给控制器类

  if(!$input->isValid())
  {
   //What should it return to controller
  }
  if(!$this->_isNumberAlreadyExists($input->number))
  {
    //What should it return to controller
  }

我可以简单地从模型类返回 false 但为此我必须保存 zend_filter_Input 实例或错误消息(如果数字已经存在)。因此在这种情况下我必须创建另一个错误处理程序对象,它可以将错误消息转换为通用格式并让控制器获取那些错误

对我来说,它看起来不像是在 zend 框架中做事的正确方式。有人愿意帮助我将错误从模型传递到 zend 框架中的控制器,还是建议一些其他方法来处理 zend 框架中的错误

4

1 回答 1

4

在我们开始之前有两个注意事项:

  1. 首先,Model不是一个类,而是一个Layer。
  2. 下面的代码不是 ZF 特定的

为了解决你的问题,你可以做

public function register()
{
    $this->assertThis($postData);
    $this->assertThat($postData);

    // do something with $postData
}

方法assertThisassertThat是您的验证方法,只是它们不会返回某些东西,而是会抛出适当的异常。由于 register 是一个命令,它根本不应该返回任何东西。

在您的控制器中,您只需捕获异常并将它们转换为您的表示层可用的格式(这就是 C+V 是什么)

public function registerAction()
{
    try {
        $this->foo->register($this->getRequest()->whatever());
    } catch (ThisException $e) {
        // handle here
    } catch (ThatException $e) {
        // handle here
    }
}

另一种选择是收集进行注册的对象内部的任何错误。然后,您当然必须返回并在该对象上提供一个方法来获取错误。因此,它为您的对象添加了杂乱无章的内容。

public function register()
{
    if ($something === false) {
        $this->errors = 'Something was false';
        return false;
    }

    // do something with $postData
}

然后你的控制器会做

public function registerAction()
{
    if (false === $this->foo->register($this->whatever())) {
        $errors = $this->foo->getErrors();
        // do something with $errors
    }
}

第三种选择是使用通知模式

一个对象,它在域层中收集有关错误和其他信息的信息并将其传达给表示。

有关深入解释,请参阅http://martinfowler.com/eaaDev/Notification.html 。

于 2012-10-09T07:40:11.633 回答