2014-03-01 55 views
5

翻譯自定義驗證消息我有Symfony2的自定義的驗證與定義:與參數

// Nip.php 

use Symfony\Component\Validator\Constraint; 

/** 
* @Annotation 
*/ 
class Nip extends Constraint 
{ 
    public $message = 'This value %string% is not a valid NIP number'; 
//... 

這是驗證碼:

// NipValidator.php 

use Symfony\Component\Validator\Constraint; 
use Symfony\Component\Validator\ConstraintValidator; 
use Symfony\Component\Validator\Exception\UnexpectedTypeException; 

class NipValidator extends ConstraintValidator 
{ 
    public function validate($value, Constraint $constraint) 
    { 

     $stringValue = (string) $value; 

     $nip = preg_replace('/[ -]/im', '', $stringValue); 
     $length = strlen($nip); 

     if ($length != 10) { 
      $this->context->addViolation(
       $constraint->message, 
       array('%string%' => $value) 
      ); 

      return; 
     } 
//... 

和我的翻譯文件:

// validators.pl.yml 

validator.nip: %string% to nie jest poprawny nip 

服務定義:

// services.yml 

services: 
    validator.nip: 
     class: BundlePath\Validator\Constraints\NipValidator 
     tags: 
      - { name: validator.constraint_validator, alias: validator.nip } 

我試圖用'validator.nip'替換$ constraint-> message,但這隻顯示'validator.nip'作爲字符串,並且它不解析爲翻譯的消息。

CustomValidator工作良好,唯一的問題是啓用翻譯。 我已經從symfony.com讀到關於約束轉換的文檔,但是這是標準驗證器而不是自定義的。

回答

0

您可以在自定義驗證器中注入翻譯器。

// services.yml 
    services: 
     validator.nip: 
      class: BundlePath\Validator\Constraints\NipValidator 
      arguments: [ "@translator" ] 
      tags: 
       - { name: validator.constraint_validator, alias: validator.nip } 

然後用它編寫的消息:

// NipValidator.php 
    protected $translator; 

    public function __construct($translator) 
    { 
     $this->translator = $translator; 
    } 

    // .... 
     $this->context->addViolation(
       $this->translator->trans($constraint->message, array(
        '%string%' => $value, 
       )) 
     ); 
0
$this->context->addViolationAt('your_path', 'translation.messate', $parameters); 
3

我認爲這個問題是你如何定義你的消息鍵和結構的驗證翻譯領域。

您的自定義夾約束消息將作爲翻譯鍵更好:

$message = error.nip.invalidNumber; 

翻譯文件應改爲:

error: 
    nip: 
     invalidNumber: %string% to nie jest poprawny nip 

您已經定義了一個服務別名是一樣的實際服務名稱(validator.nip)。我不確定這是否會導致錯誤,但爲了安全起見,我會將別名設置爲app_nip_validator。

最後,在您的自定義驗證程序中,刪除退貨並更改建立違規的方式。

 if ($length != 10) { 
      $this->context->buildViolation($constraint->message) 
       ->setParameter('%string%', $value) 
       ->addViolation(); 

      // return; 
     } 
+1

在使用自定義的翻譯文件,你可以使用: '$這個 - >上下文> buildViolation($ constraint->消息) - >的setParameter( '%字符串%',$值) - > setTranslationDomain('mydomain') - > addViolation();' – nexana