2012-04-26 6 views
5

Ich mag die Idee der Verwendung von FUSE-Modellen für die Validierung in RedbeanPHP.Validierung in Redbean PHP

Meine Anwendungen erfordern manchmal die Annahme von Daten über mehrere Quellen (Formular, Datei, usw.), so dass die Validierung der eigentlichen Klassenaktualisierung sinnvoll ist.

Wenn Sie sich die Beispiele auf der Redbean-Site ansehen, scheint die Validierung auf dem Auslösen einer Ausnahme zu basieren.

Natürlich können Sie nur eine Ausnahme auslösen, also nehme ich an, dass ich eine zusätzliche Eigenschaft vom Typ "Array" in meiner FUSE-Klasse erstellen müsste, um Validierungsnachrichten zu einzelnen Feldern zu halten.

Hat jemand bessere Ideen? Hier ist, was ich bisher versucht, ...

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

?> 

Antwort

10

Sie RedBean_SimpleModel Klasse erweitern können Ihre eigenen Methoden und Felder, um es hinzuzufügen, so wird es mit all Ihrem Modell. Dann können Sie Transaktionen verwenden, um Ihre Validierungen zu verwalten. Es könnte so (Code nicht getestet) aussehen:

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

Dann Modell könnte wie folgt aussehen:

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

Interessanter Ansatz. Ich denke, dass ich mich dafür entschieden habe, die Ausnahmeklasse zu erweitern. – christian