2012-04-26 10 views
5

में प्रमाणीकरण मुझे RedbeanPHP में सत्यापन के लिए FUSE मॉडल का उपयोग करने का विचार पसंद है।रेडबीन PHP

मेरे अनुप्रयोगों को कभी-कभी कई स्रोतों (फॉर्म, फ़ाइल इत्यादि) के माध्यम से डेटा स्वीकार करने की आवश्यकता होती है, इसलिए वास्तविक वर्ग अपडेट पर सत्यापन को समझ में आता है।

रेडबीन साइट पर उदाहरणों को देखते हुए, सत्यापन अपवाद फेंकने पर आधारित प्रतीत होता है।

बेशक, आप केवल एक अपवाद फेंक सकते हैं, इसलिए मुझे लगता है कि मुझे अलग-अलग क्षेत्रों से जुड़े सत्यापन संदेशों को रखने के लिए अपने 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>"; 
} 

?> 

उत्तर

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

दिलचस्प दृष्टिकोण। मुझे लगता है कि मैंने अपवाद वर्ग को विस्तारित करने का फैसला किया है। – christian