Symfony嵌套验证约束

时间:2016-06-19 00:51:42

标签: php validation constraints symfony

我遇到了好奇的问题。让我们说我们想要验证一些id。验证应该通过10个不同的条件(约束),我们必须在10个不同的地方进行。我以为我可以通过在另一个验证中嵌套一个验证来节省自己编写不需要的代码。

这就是我的所作所为:

  • 我创建了名为IdParameter的新的自定义验证约束
  • 我已将IdParameterValidator.php文件注册为服务并向其注入验证器服务
  • 我已经在那里放了另一个验证过程(在我们的示例中,我必须在10个不同的地方使用10个约束) - 我使用Constraints \ Collection来做到这一点,所以看起来有点像这样:

    <?php
    
    namespace Awesome\BlogBundle\Validator\Constraints;
    
    use Symfony\Component\Validator;
    
    class IdParameterValidator extends Validator\ConstraintValidator
    {
        private $_data = array();
        private $_validator;
    
    
    public function __construct(Validator\Validator\RecursiveValidator $validator)
    {
        $this->_validator = $validator;
    }
    
    public function validate($value, Validator\Constraint $constraint)
    {
        /* Preparing object of constraints */
        $postIDConstraints = new Validator\Constraints\Collection(array(
            'postId' => array(
                new Validator\Constraints\Type(array(
                    'type' => 'integer',
                    'message' => 'This ain\'t no integer man!'
                )),
                new Validator\Constraints\Range(array(
                    'min' => 1,
                    'minMessage' => 'Post id is not valid'
                ))
            )
        ));
    
        /* Validating ID */
        $this->_data['errors'] = $this->_validator->validate(array('postId' => $value), $postIDConstraints);
    
        /* Checking validation result */
        if(count($this->_data['errors']) > 0) {
            $this->context->buildViolation($constraint->message)->addViolation();
        }
      }
    }
    

所以现在我可以使用尽可能多的约束,但仍然有一个干净的服务代码:

$postIDConstraints = new Validator\Constraints\Collection(array(
    'postId' => array(
         new myValidator\Constraints\IdParameter()
     )
 ));

 /* Validating postID */
 $this->_data['errors'] = $this->_validator->validate(array('postId' => (int)$postID), $postIDConstraints);

我想知道这是否正确?

最诚挚的问候, R上。

P.S 我总是评论我的代码 - 我没有在这里发表评论以保持清洁。

0 个答案:

没有答案