2013-03-12 10 views
8

Respect Validation के साथ मेरे पास कई कस्टम त्रुटियां संदेश कैसे हैं Iप्रमाणीकरण का सम्मान कई कस्टम त्रुटि संदेशों

मेरे पास कुछ इनपुट है जो मैं एकाधिक सत्यापनकर्ताओं के खिलाफ मान्य करना चाहता हूं। और मैं प्रत्येक सत्यापन के लिए एक कस्टम त्रुटि संदेश चाहता हूँ।

यह है कि मैं क्या करने की कोशिश की है:

try { 
    Respect\Validation\Validator::create() 
     ->key('foo', 
      v::length(20)->setName('bar')->setTemplate('Custom length message.') 
      ->alnum()->setName('baz')->setTemplate('Custom alnum message.') 
     ) 
     ->assert([ 
      'foo' => 'Hello, world!', 
     ]); 
} catch (Respect\Validation\Exceptions\ValidationException $exception) { 
    $errors = $exception->findMessages([ 
     'bar', 
     'baz', 
    ]); 
    var_dump($errors); 
} 

उत्पादन होता है:

array (size=2) 
    'bar' => string '' (length=0) 
    'baz' => string 'Custom alnum message.' (length=21) 

मैं उत्पादन दोनों कस्टम त्रुटि संदेश को यह उम्मीद थी।

Idealy मैं की तरह 1 इनपुट के लिए संदेशों की एक सरणी मिल सकता है:

var_dump($exception->findMessages(['foo'])); 

मुझे दे सकते हैं:

array (size=1) 
    'foo' => 
    array (size=2) 
     0 => string 'Custom length message.' (length=22) 
     1 => string 'Custom alnum message.' (length=21) 

यह सवाल लुढ़क खरपतवार की तरह लगता है।

+1

1. बेवकूफ सवाल है, लेकिन कितनी पुरानी है, अपने सम्मान का निर्माण है()' एक साल से काम या तो वापस, "_when अपवाद बनाया जाता है, यह अगर टेम्पलेट की जाँच करता है वहाँ है, लेकिन यह null_ "https://github.com/Respect/Validation/issues/64 के रूप में वापस आता है। 2. मुझे इस फ़ंक्शन के लिए कोई डॉको नहीं मिला, क्या यह सार्वजनिक एपीआई के हिस्से के रूप में है (और इसलिए, क्या आप जानते हैं कि यह _should_ काम करता है जैसा आप उम्मीद कर रहे हैं)? 3. क्या आपने संयोजन में विभिन्न सत्यापनकर्ताओं की कोशिश की है? उदाहरण के लिए यह हमेशा आखिरी है जो अपना संदेश जोड़ता है? – Sepster

+0

4. बस ब्याज से बाहर, क्या आपको 'जानकारी प्राप्त करने के लिए' getfullMessage(); से अपेक्षित आउटपुट मिलता है (http://formocument.com/Respect/Validation/#feature-guide/informative-exceptions) में डॉको? यह कम से कम एक सुराग दे सकता है कि यह संदेश _within_ जो खो गया है, या अपवाद को आउटपुट करने में त्रुटि है। – Sepster

+0

@ सेप्स्टर 1. मैं नवीनतम देव-मास्टर का उपयोग कर रहा हूं। 2।मुझे कोड को देखकर फ़ंक्शन मिला, यह एक सार्वजनिक विधि है इसलिए कोई इसे सार्वजनिक एपीआई का हिस्सा मान लेगा। 3. हां यह हमेशा श्रृंखला में अंतिम वैधता प्रतीत होता है। 4. 'getFullMessage() 'कस्टम वाले के बजाय डिफ़ॉल्ट संदेशों को आउटपुट करता है। – Petah

उत्तर

3

आप उन्हें एक साथ श्रृंखला नहीं कर सकते और कस्टम संदेश मिलता है, के रूप में श्रृंखलन के कार्यान्वयन की वजह से अलग-अलग नियमों वह करने का विरोध किया है क्योंकि आप फोन पिछले कस्टम संदेश केवल नियम-सेट करने के लिए आवंटित किया जाएगा।

इस प्रदर्शन करने के लिए, मैं इसे Git से क्लोन, एक बिन निर्देशिका बनाया है, और इस test.php

<?php 
set_include_path(implode(PATH_SEPARATOR, array(
    realpath('../library') 
))); 

function __autoload($class_name) { 
    include $class_name . '.php'; 
} 

use Respect\Validation\Validator as v; 

try { 
    $chained = Respect\Validation\Validator::create() 
     ->key('foo', 
      v::length(20)->setName('bar')->setTemplate('Custom length message.') 
      ->alnum()->setName('baz')->setTemplate('Custom alnum message.') 
     ); 

    print_r($chained); 

    $chained->assert(array(
      'foo' => 'Hello, world!', 
     )); 

} catch (Respect\Validation\Exceptions\ValidationException $exception) { 
    $errors = $exception->findMessages(array(
     'bar', 
     'baz', 
    )); 
    var_dump($errors); 
} 

the print_r($chained) shows us: 

Respect\Validation\Validator Object 
(
    [rules:protected] => Array 
     (
      [00000000791c0e000000000030f3f15e] => Respect\Validation\Rules\Key Object 
       (
        [mandatory] => 1 
        [reference] => foo 
        [validator] => Respect\Validation\Validator Object 
         (
          [rules:protected] => Array 
           (
            [00000000791c0e030000000030f3f15e] => Respect\Validation\Rules\Length Object 
             (
              [minValue] => 20 
              [maxValue] => 
              [inclusive] => 1 
              [name:protected] => 
              [template:protected] => 
             ) 

            [00000000791c0e020000000030f3f15e] => Respect\Validation\Rules\Alnum Object 
             (
              [additionalChars] => 
              [stringFormat] => /^(\s|[a-zA-Z0-9])*$/ 
              [name:protected] => 
              [template:protected] => 
             ) 

           ) 

          [name:protected] => baz 
          [template:protected] => Custom alnum message. 
         ) 

        [name:protected] => foo 
        [template:protected] => 
       ) 

     ) 

    [name:protected] => 
    [template:protected] => 
) 

आप देख सकते हैं के साथ थोड़ा अपने नमूना संशोधित कि नियम-सेट अंतिम नाम लेने और साथ ही अंतिम टेम्पलेट में पारित किया गया, और वास्तविक सत्यापन वस्तुओं में से कोई भी नाम या टेम्पलेट नहीं मिला। मैं वास्तव में ऐसा करने के लिए लाइब्रेरी में किसी भी तरह से नहीं देख रहा हूं जिसे आप करने का प्रयास कर रहे हैं।

तो मैंने एक रास्ता बनाने का फैसला किया। मेरे में ../bin निर्देशिका मैंने इस कक्षा को बनाया, वाल्डिटर वर्ग का विस्तार किया।

<?php 
use Respect\Validation\Validator as v; 
class BubbaValidator extends v { 

    public function getRuleset($rulename = null){ 
     if (is_null($rulename)) return $this->rules; 
     foreach ($this->rules as $rule){ 
      if ($rule->getName() == $rulename){ 
       return $rule; 
      } 
     } 
    } 

    public function getValidatorRules($rulesetName, $ruleType=null){ 
     $ruleset = $this->getRuleset($rulesetName); 
     $validators = $ruleset->validator; 

     if (is_null($ruleType)){ 
      return $validators; 
     } 

     foreach ($validators->rules as $key=>$validator){ 
      if (get_class($validator) === 'Respect\Validation\Rules\\'.$ruleType){ 
       $validator->name = "bar"; 
       $validator->template = "bubba rocks"; 
       $validators->rules[$key]->name = "bar"; 
       $validators->rules[$key]->template = "bubba rocks"; 
       return $validator; 
      } 
     } 
    } 

    public function setValidatorRuleName($rulesetName, $ruleType, $name){ 
     $ruleset = $this->getRuleset($rulesetName); 
     $validators = $ruleset->validator; 
     foreach ($validators->rules as $key=>$validator){ 
      if (get_class($validator) === 'Respect\Validation\Rules\\'.$ruleType){ 
       $validators->rules[$key]->name = $name; 
       return $validator; 
      } 
     } 
    } 

    public function setValidatorRuleTemplate($rulesetName, $ruleType, $template){ 
     $ruleset = $this->getRuleset($rulesetName); 
     $validators = $ruleset->validator; 
     foreach ($validators->rules as $key=>$validator){ 
      if (get_class($validator) === 'Respect\Validation\Rules\\'.$ruleType){ 
       $validators->rules[$key]->template = $template; 
       return $validator; 
      } 
     } 
    } 

} 

तो मैं स्क्रिप्ट modifed और यह

भाग गया
<?php 
set_include_path(implode(PATH_SEPARATOR, array(
    realpath('../library'), 
    realpath(__DIR__) 
))); 

function __autoload($class_name) { 
    include $class_name . '.php'; 
} 

use BubbaValidator as v; 

try { 
    $chained = new BubbaValidator(); 
    $chained->key('foo', 
      v::length(20)->setName('bar')->setTemplate('Custom length message.') 
      ->alnum()->setName('baz')->setTemplate('Custom alnum message.') 
     ); 

    $chained->setValidatorRuleName('foo', 'Alnum', 'baz'); 
    $chained->setValidatorRuleTemplate('foo', 'Alnum', 'Bubba\'s Custom Alnum!'); 
    $chained->setValidatorRuleName('foo', 'Length', 'bar'); 
    $chained->setValidatorRuleTemplate('foo', 'Length', 'Bubba\'s Custom Length!'); 

    $chained->assert(array(
      'foo' => 'Hello, world!', 
     )); 

} catch (Respect\Validation\Exceptions\ValidationException $exception) { 
    $errors = $exception->findMessages(array(
     'bar', 
     'baz', 
    )); 
    var_dump($errors); 
} 

अंत में इस उत्पादन प्राप्त करने के लिए:

D:\Users\Bubba\git\Validation\bin>php test.php 
    array(2) { 
    ["bar"]=> 
    string(22) "Bubba's Custom Length!" 
    ["baz"]=> 
    string(21) "Custom alnum message." } 

मजेदार था कि! के रूप में ऐसा लगता है कि `setTemplate साथ एक बग था

संबंधित मुद्दे