【问题标题】:How to pass errors from model to controller in zend framework如何在zend框架中将错误从模型传递到控制器
【发布时间】:2012-09-29 01:08:28
【问题描述】:

我正在使用 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 框架中的错误

【问题讨论】:

    标签: php oop zend-framework design-patterns


    【解决方案1】:

    开始之前的两个注意事项:

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

    要解决您的问题,您可以这样做

    public function register()
    {
        $this->assertThis($postData);
        $this->assertThat($postData);
    
        // do something with $postData
    }
    

    assertThisassertThat 方法是您的验证方法,只是它们不会返回某些内容,而是会抛出适当的异常。 Since register is a Command, it should not return anything at all.

    在您的控制器中,您只需捕获异常并将它们转换为您的表示层可用的格式(这就是 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 了解详细说明。

    【讨论】:

    • 非常好,非常感谢你,一如既往,我从你的帖子中学到了一些新东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多