2013-05-13 25 views
6

मैं एक नया उपयोगकर्ता बनाने पर सत्यापन के लिए निम्नलिखित नियम का उपयोग करें:Laravel 4 मान्यकरण

protected $rules= [ 
    'name' => 'required', 
    'email' => [ 
     'required', 
     'unique:user', 
     'email' 
    ] 
]; 

एक मौजूदा उपयोगकर्ता मैं के रूप में ऊपर दिखाए गए एक ही नियम-सेट का उपयोग, लेकिन एक प्रमाणीकरण त्रुटि यदि नहीं करना चाहती अपडेट करते समय उपयोगकर्ता ने अपना ईमेल बिल्कुल नहीं बदला।

मैं वर्तमान में निम्नलिखित का उपयोग करके इस हल:

if (!User::changed('email')) { 
    unset($user->email); 
} 

यह मेरे लिए एक गंदा वैकल्पिक हल की तरह लगता है तो मैं सोच रहा था अगर वहाँ बेहतर विकल्प हैं।

यह भी ध्यान दें कि changed विधि कुछ है जो मैंने स्वयं लिखा है। क्या किसी को पता है कि एक मूल संपत्ति है या नहीं, यह जांचने के लिए मूल लारवेल 4 विधि है?

धन्यवाद!

+0

हाय इस सवाल का मेरा यह उत्तर की जाँच [http://stackoverflow.com/questions/16976207/laravel-4-validation-uniquedatabase-ignore-current][1], मैं इस मदद की उम्मीद है। [1]: आईडी: http://stackoverflow.com/questions/16976207/laravel-4-validation-uniquedatabase-ignore-current – Bradley

उत्तर

9

अद्वितीय सत्यापन नियम किसी दिए गए आईडी को अनदेखा करने की अनुमति देता है, जो आपके मामले में डेटा सेट की आईडी है जिसे आप अपडेट कर रहे हैं।

'email' => 'unique:users,email_address,10' 

http://four.laravel.com/docs/validation#rule-unique

+5

Btw, मैं इस एक प्लेसहोल्डर 'का उपयोग करके हल में' मेरी सत्यापन नियमों और फिर मान्य से पहले नियमों की प्रक्रिया: https://github.com/betawax/role-model/blob/master/src/Betawax/RoleModel/RoleModel.php#L86-L101 –

+0

मैं एक प्लेसहोल्डर का उपयोग करने का विचार पसंद लेकिन मैं वास्तव में आपके दृष्टिकोण से आश्वस्त नहीं हूँ। परिवर्तन राज्य से संबंधित मेरे 'दूसरे' प्रश्न पर कोई विचार? मैं एक बदली हुई विधि के बारे में Laravel 3 के स्रोत में कुछ संदर्भ मिले लेकिन यह अब तक Laravel 4 –

+0

में नहीं मिला है मेरे कोड उदाहरण में, मैं '$ this-> getKey()' जो नए के लिए उपलब्ध है * और साथ प्लेसहोल्डर की जगह * मौजूदा डेटा सेट। इसलिए आपको इस बात की परवाह नहीं है कि आप एक नया मॉडल बना रहे हैं या मौजूदा मॉडल को अपडेट कर रहे हैं या नहीं। बस प्लेसहोल्डर को हर सहेजने की घटना पर प्रतिस्थापित करें। आप या तो Eloquent की 'save()' विधि को ओवरराइट करके या [मॉडल ईवेंट] (http://four.laravel.com/docs/eloquent#model-events) का उपयोग करके ऐसा कर सकते हैं। –

1

http://four.laravel.com/docs/validation#rule-unique

पर दस्तावेज़ देखें आप उन खुद आईडी

protected $rules= [ 
    'name' => 'required', 
    'email' => [ 
     'required', 
     'unique:user,email,THE_USERS_USER_ID', 
     'email' 
    ] 
]; 
+1

मुझे पैरामीटर को बहिष्कृत करने के बारे में पता है लेकिन मुझे अपने नियमपत्र में सवाल लगाने का कोई वैध गैर-हैकिश तरीका नहीं है, इसलिए सवाल। –

+0

आप इस हैकिश पर क्यों विचार करते हैं? – Puzbie

0

बाहर कर सकते हैं मैं अपने सत्यापनकर्ता समारोह में बात की इस तरह संभाल। मेरी वैधता सरणी एक वर्ग चर के रूप में सेट है। मैं तो कुछ इस तरह करते हैं:

public function validate() 
{ 
    //exclude the current user id from 'unqiue' validators 
    if($this->id > 0) 
    { 
     $usernameUnique = 'unique:users,username,'.$this->id; 
     $emailUnique = 'unique:users,email,'.$this->id; 
     $apiUnique = 'unique:users,api_key,'.$this->id; 
    } 
    else 
    { 
     $usernameUnique = 'unique:users,username'; 
     $emailUnique = 'unique:users,email'; 
     $apiUnique = 'unique:users,api_key'; 
    } 

    $this->validators['username'] = array('required', 'max:32', $usernameUnique); 
    $this->validators['email'] = array('required', 'max:32', $emailUnique); 
    $this->validators['api_key'] = array('required', 'max:32', $apiUnique); 

    $val = Validator::make($this->attributes, $this->validators); 

    if ($val->fails()) 
    { 
     throw new ValidationException($val); 
    } 
} 
4

एक दृष्टिकोण मॉडल में एक मान्यता समारोह बना सकते हैं और नियंत्रक इनपुट, परिदृश्य और आईडी में गुजर से कॉल करने के लिए (अनदेखी करने के लिए) है।

public function validate($input, $scenario, $id = null) 
{ 
    $rules = []; 

    switch($scenario) 
    { 
     case 'store': 
      $rules = [ 
       'name'  => 'required|min:5|unique:users', 
       'email' => 'required|email|unique:users', 
       'password' => 'required|min:4|confirmed' 
      ]; 
      break; 

     case 'update'; 
      $rules = [ 
       'name'  => 'required|min:5|unique:users' .',name,' . $id, 
       'email' => 'required|email|unique:users' .',email,' . $id, 
       'password' => 'min:4|confirmed' 
      ]; 
      break; 
    } 

    return Validator::make($input, $rules); 
} 

फिर नियंत्रक में:

$input  = Input::all(); 
    $validation = $user->validate($input, 'update', $user->id); 

    if ($validation->fails()) 
    { 
     // Do stuff 
    } 
    else 
    { 
     // Validation passes 
     // Do other stuff 
    } 

दूसरों के रूप में उल्लेख किया है, अद्वितीय नियम 3 पैरामीटर अनदेखी करने के लिए एक आईडी निर्दिष्ट करता है। आप प्रमाणीकरण फ़ंक्शन का पुन: उपयोग करने के लिए 'लॉगिन' जैसे अन्य मामले जोड़ सकते हैं।

वैकल्पिक रूप से, जेफरी वे Tuts Premium has a great series of lessons in "What's New In Laravel 4" पर जिसमें सेवाओं और श्रोताओं का उपयोग करके सत्यापन को संभालने के लिए कुछ अन्य दृष्टिकोण शामिल हैं।

+0

मॉडल में सत्यापन नियम जोड़ना सही समाधान प्रतीत होता है। imho स्टोर के लिए पैरामीटर जोड़ने या हर बार अद्यतन करने के लिए गंदा है। यह पोस्ट एक समान समाधान का पालन करता है http://forums.laravel.io/viewtopic.php?id=12104 शायद यह किसी की मदद करता है। – simon

1

2014-01-14 के रूप में, आप sometimes विशेषता का उपयोग कर सकते हैं, मेरा मानना ​​है कि टेलर उन्हें Laravel 4,1

$v = Validator::make($data, array(
    'email' => 'sometimes|required|email', 
)); 

sometimes को 2 दिन पहले जोड़ा केवल इनपुट को मान्य यदि वह मौजूद है। यदि आपके पास सम्मिलित करने के लिए डिफ़ॉल्ट मान नहीं है, तो यह आपके सटीक परिदृश्य के अनुरूप हो सकता है या नहीं।

http://laravel.com/docs/validation#conditionally-adding-rules

+0

इसे साझा करने के लिए धन्यवाद !! – simon

0

मैं अद्यतन के लिए अलग नियम होने और मॉडल की तरह उपयोगकर्ता, ऐसा करने की आवश्यकता है कि पर बनाने के द्वारा इस का समाधान कर लिया।

मैं दोनों $ नियम और $ update_rules परिभाषित किया गया है एक मॉडल वर्ग कि सुवक्ता, जहां मैं मान्यता को परिभाषित फैली हुई है, और उसके बाद सभी बच्चे मॉडल है कि मॉडल का विस्तार हो सकता है। यदि आप केवल $ नियमों को परिभाषित करते हैं, तो इसका उपयोग दोनों को बनाने और अपडेट करने के लिए किया जाएगा।

class Model extends Eloquent { 
    protected $errors; 
    protected static $rules = array();  
    protected $validator; 

    public function __construct(array $attributes = array(), Validator $validator = null) { 
     parent::__construct($attributes);  
     $this->validator = $validator ?: \App::make('validator'); 
    } 

    protected static function boot() { 
     parent::boot(); 

     # call validatie when createing 
     static::creating(function($model) { 
      return $model->validate(); 
     }); 

     # call validatie when updating with $is_update = true param 
     static::updating(function($model) { 
      return $model->validate(true); 
     }); 
    } 

    public function validate($is_update = false) { 
     # if we have $update_rules defined in the child model, and save is an update 
     if ($is_update and isset(static::$update_rules)) { 
      $v = $this->validator->make($this->attributes, static::$update_rules); 
     } 
     else { 
      $v = $this->validator->make($this->attributes, static::$rules); 
     } 

     if ($v->passes()) { 
      return true; 
     } 

     $this->setErrors($v->messages()); 
     return false; 
    } 

    protected function setErrors($errors) { 
     $this->errors = $errors; 
    } 

    public function getErrors() { 
     return $this->errors; 
    } 

    public function hasErrors() { 
     return ! empty($this->errors); 
    } 
} 
संबंधित मुद्दे