2012-04-26 33 views
5

Tôi thích ý tưởng sử dụng các mô hình FUSE để xác thực trong RedbeanPHP.Xác thực trong Redbean PHP

Ứng dụng của tôi đôi khi yêu cầu chấp nhận dữ liệu qua nhiều nguồn (biểu mẫu, tệp, v.v.), do đó việc xác thực trên bản cập nhật lớp thực tế có ý nghĩa.

Nhìn vào các ví dụ trên trang web Redbean, xác thực có vẻ dựa trên việc ném một ngoại lệ. Tất nhiên, bạn chỉ có thể ném một ngoại lệ, vì vậy tôi giả định rằng tôi cần phải tạo thêm thuộc tính kiểu "mảng" trong lớp FUSE của tôi để giữ các thông báo hợp lệ liên kết với các trường riêng lẻ.

Có ai có ý tưởng nào tốt hơn không? Dưới đây là những gì tôi đã cố gắng cho đến nay ...

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

?> 

Trả lời

10

Bạn có thể mở rộng RedBean_SimpleModel lớp để thêm các phương pháp và các lĩnh vực của riêng bạn để nó, vì vậy nó sẽ làm việc với tất cả các mô hình của bạn. Sau đó, bạn có thể sử dụng giao dịch để quản lý xác thực của mình. Nó có thể giống như thế này (mã không kiểm tra):

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

Sau đó, mô hình của bạn có thể trông như thế này:

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

cách tiếp cận thú vị. Tôi nghĩ rằng tôi đã quyết định mở rộng lớp học ngoại lệ mặc dù. – christian