2013-03-12 52 views
8

Respect Validationで複数のカスタムエラーメッセージを表示するにはどうすればいいですか?バリデーション検証複数のカスタムエラーメッセージ

私は、複数のバリデータに対して妥当性を確認する入力があります。そして私は、それぞれの検証のためのカスタムエラーメッセージが必要です。

これは私が試したものです:

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) 

は、私は出力の両方のカスタムエラーメッセージにそれを期待しました。私は次のように1つの入力にメッセージの配列を得ることができ

Idealy:

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.敬虔な質問ですが、あなたのRespectビルドは何年ですか?setTemplate()関数が1年ほど前にバグがあったように見えます。 "例外が作成されたときに、テンプレートそこにありますが、null_ "https://github.com/Respect/Validation/issues/64として戻ってきます。 2.私はこの関数のdoccoを見つけることができませんでした。それはパブリックAPIの一部として意図されています(したがって、あなたが期待している通りに動作するかどうか知っていますか? 3.異なるバリデーターを組み合わせて試しましたか?たとえば、メッセージを追加するのは最後のものだけですか? – Sepster

+0

4.興味深いところでは、[有益な催促](http://documentup.com/Respect/Validation/#feature-guide/informative-exceptions)に従って、 'getFullMessage();'から期待される出力を得ますか?ドコ?これは少なくとも、失われた例外、または例外を出力するエラーのメッセージであるかどうかの手がかりを与えるかもしれません。 – Sepster

+0

@Sepster 1.私は最新のdev-masterを使用しています。 2。私はコードを調べることによって関数を見つけました。これはパブリックメソッドなので、パブリックAPIの一部と見なします。 3.はい、チェーン内の最後のバリデーターであるようです。 4. 'getFullMessage()'はカスタムメッセージではなくデフォルトメッセージを出力します。 – Petah

答えて

3

あなたが呼び出した最後のカスタムメッセージは、チェーンの実装のために個々のルールではなくルールセットに割り当てられるため、それらを連鎖させてカスタムメッセージを取得することはできません。

これを実証し、私はあなたがルールセットは、最後の名前をピックアップし、だけでなく、ことがわかり、gitのからそれをクローン化されたbinディレクトリを作成し、この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] => 
) 

で少しあなたのサンプルを修正するには渡された最後のテンプレートと、実際の検証オブジェクトのどちらもNameまたはTemplateを取得していないことを確認します。私はあなたがしようとしていることを実際に行うために図書館には何も表示されません。

私は道を作ることにしました。私の../binディレクトリで、私はこのクラスを作成し、Valditorクラスを拡張しました。

<?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." } 

楽しかったです!

関連する問題