2017-08-25 118 views
0

我有一個模型和一個屬性$test。 我有一個annotation斷言最大長度。但我不想統計空白,只有字符。所以text必須有40個字符,而不是40個字符與空格的混合。這可能嗎?Symfony:斷言/長度忽略空白

/** 
    * @var string 
    * 
    * @Assert\NotBlank(message = "text.length.error") 
    * @Assert\Length(
    *  max = 40, 
    *  maxMessage = "Only 40 letters." 
    *) 
    */ 
    protected $text; 

回答

1

您可以創建自己的約束:

CharacterLength.php

namespace AppBundle\Validator\Constraints; 

use Symfony\Component\Validator\Constraint; 

/** 
* @Annotation 
*/ 
class CharacterLength extends Constraint 
{ 
    public $max; 
    public $maxMessage; 
} 

CharacterLengthValidator.php

namespace AppBundle\Validator\Constraints; 

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

class CharacterLengthValidator extends ConstraintValidator 
{ 
    /** 
    * @param string $text 
    * @param Constraint $constraint 
    */ 
    public function validate($text, Constraint $constraint) 
    { 
     if (strlen(str_replace(" ", "", $this->text)) > $constraint->max) { 
      $context 
       ->buildViolation($constraint->maxMessage) 
       ->addViolation(); 
     } 
    } 
} 

YourEntity.php

use AppBundle\Validator\Constraints\CharacterLength; 

/** 
* @var string 
* 
* @CharacterLength(
*  max = 40, 
*  maxMessage = "Only 40 letters." 
*) 
*/ 
protected $text; 
2

井LengthValidator類是使用mb_strlen函數確定的長度。如果你想使用非空白字符進行驗證,你需要創建一個定製的驗證器。

註釋:

/** 
* @var string 
* 
* @Assert\NotBlank(message = "text.length.error") 
* @Assert\Callback("validate") 
*/ 
protected $text; 

驗證方法(在同一個班):

public function validate(ExecutionContextInterface $context) { 
    if (40 > strlen(str_replace(" ", "", $this->text))) { 
     $context->buildViolation('Only 40 letters.') 
      ->atPath('text') 
      ->addViolation(); 
    } 
} 

這個梅託德的參數是Symfony\Component\Validator\Context\ExecutionContextInterface一個實例,請務必在導入文件頂部。

有關更多信息(例如,如何將驗證放入單獨的課程),請檢查symfony documentation