2012-04-26 23 views
5

Me gusta la idea de usar modelos FUSE para la validación en RedbeanPHP.Validación en Redbean PHP

Mis aplicaciones a veces requieren la aceptación de datos a través de múltiples fuentes (formulario, archivo, etc.), por lo que tiene sentido poner la validación en la actualización de la clase real.

Mirando los ejemplos en el sitio Redbean, la validación parece estar basada en lanzar una excepción.

Por supuesto, solo puedes lanzar una excepción, así que supongo que necesitaría crear una propiedad adicional de tipo "array" en mi clase FUSE para guardar los mensajes de validación asociados con campos individuales.

¿Alguien tiene alguna idea mejor? Esto es lo que he estado tratando hasta ahora ...

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

?> 

Respuesta

10

Puede extender RedBean_SimpleModel clase para añadir sus propios métodos y campos a la misma, por lo que funciona con toda su modelo. Luego, puede usar transacciones para administrar sus validaciones. Se podría tener este aspecto (código no probado):

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

Entonces, el modelo podría tener este aspecto:

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

enfoque interesante. Sin embargo, creo que he decidido extender la clase de excepción. – christian

Cuestiones relacionadas