Я столкнулся с любопытной проблемой. Допустим, мы хотим подтвердить некоторый идентификатор. Валидация должна пройти 10 различных условий (ограничений), и мы должны сделать это в 10 разных местах. Я думал, что могу спасти себя, написав несекретный код, вложив одну проверку в другую.
Вот что я сделал:
Я поставил еще один процесс проверки (в нашем примере 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);
Мне интересно, если это правильный подход?
С уважением,
Р.
P.S
Я всегда комментирую свой код — я не помещал здесь комментарии, чтобы сохранить его в чистоте.
Задача ещё не решена.
Других решений пока нет …