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

始める前の 2 つの注意事項:

  1. まず、モデルはクラスではなくレイヤーです。
  2. 以下のコードは ZF 固有のものではありません

あなたができる問題を解決するために

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

    // do something with $postData
}

メソッドassertThisとメソッドassertThatは検証メソッドであり、何かを返す代わりに、適切な例外をスローします。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
    }
}

3 番目のオプションは、通知パターンを使用することです。

ドメイン層でエラーに関する情報やその他の情報を収集し、プレゼンテーションに伝達するオブジェクト。

詳細な説明については、http://martinfowler.com/eaaDev/Notification.htmlを参照してください。

于 2012-10-09T07:40:11.633 に答える