5

RedbeanPHP での検証に FUSE モデルを使用するというアイデアが気に入っています。

私のアプリケーションでは、複数のソース (フォーム、ファイルなど) からデータを受け入れる必要がある場合があるため、実際のクラスの更新に検証を行うことは理にかなっています。

Redbean サイトの例を見ると、検証は例外のスローに基づいているようです。

もちろん、スローできる例外は 1 つだけなので、個々のフィールドに関連付けられた検証メッセージを保持するために、FUSE クラスに「配列」タイプの追加のプロパティを作成する必要があると想定しています。

誰もがより良いアイデアを持っていますか? これが私がこれまで試してきたことです...

<form action="" method="post">
    <p>your name: <input name="name" type="text"></p>

    <p>your email: <input name="email" type="text"></p>

    <p>your message:</p>
    <textarea name="message" id="" cols="30" rows="10"></textarea>
    <input name="send" value="send message" type="submit">
</form>

<?php

/**
 * @property $name string
 * @property $email string
 * @property $message string
 */
class Model_Comment extends RedBean_SimpleModel{
    public $invalid = array();
    public function update(){
        if(empty($this->name)) $this->invalid['name'] = "field is empty";
        if(empty($this->email)) $this->invalid['email'] = "field is empty";
        if(empty($this->message)) $this->invalid['message'] = "field is empty";
        if(count($this->invalid) > 0) throw new Exception('Validation Failed!');
    }
    public function getInvalid(){
        return $this->invalid;
    }
}

if(isset($_POST['send'])){

    $comment = R::dispense('comment');
    /* @var $comment Model_Comment */
    $comment->import($_POST,'name,email,message');

    try{
        R::store($comment);
    }
    catch(Exception $e){
        echo $e->getMessage();
        $invalid = $comment->getInvalid();
        print_r($invalid);
        exit;
    }
    echo '<p>thank you for leaving a message.</p>';
}
echo "<h2>What people said!</h2>";

$comments = R::find('comment');
/* @var $comments Model_Comment[] */

foreach($comments as $comment){
    echo "<p>{$comment->name}: {$comment->message}</p>";
}

?>
4

1 に答える 1

10

クラスを拡張RedBean_SimpleModelして独自のメソッドとフィールドを追加できるため、すべてのモデルで機能します。次に、トランザクションを使用して検証を管理できます。次のようになります (コードはテストされていません)。

class RedBean_MyCustomModel extends RedBean_SimpleModel {
  private $errors = array();
  public function error($field, $text) {
    $this->errors[$field] = $text;
  }
  public function getErrors() {
    return $this->errors;
  }
  public function update() {
    $this->errors = array(); // reset the errors array
    R::begin(); // begin transaction before the update
  }
  public function after_update() {
    if (count($this->errors) > 0) {
      R::rollback();
      throw new Exception('Validation failed');
    }
  }
}

次に、モデルは次のようになります。

class Model_Comment extends RedBean_MyCustomModel {
    public function update(){
        parent::update();
        if(empty($this->name)) $this->error('name', 'field is empty');
        if(empty($this->email)) $this->error('name', 'field is empty');
        if(empty($this->message)) $this->error('name', 'field is empty');
    }
    public function getInvalid(){
        return $this->invalid;
    }
}
于 2012-05-06T19:44:18.037 に答える