2012-04-26 4 views
5

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

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

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

もちろん例外は1つしか投げることができないので、個々のフィールドに関連付けられた検証メッセージを保持するために、FUSEクラスに "array"という型の追加プロパティを作成する必要があると仮定しています。

もっと良いアイデアはありますか?ここで私はこれまでにしようとしてきたものだ...

<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>"; 
} 

?> 

答えて

10

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

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; 
    } 
} 
+0

興味深いアプローチ:次に

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'); } } } 

、あなたのモデルは次のようになります。私は例外クラスを拡張することを決めたと思う。 – christian

関連する問題