Я работаю над ограничением проверки, проверяющим наличие URL-адреса. Я сделал это, но я хотел бы иметь возможность передавать параметры, которые говорят, что мой url может быть пустым, и это будет O.K.Как передать параметры в пользовательское ограничение проверки в Symfony 2
Я знаю, что вы можете передать параметры в какой-то проверке, которая поставляется с Symfony 2 для Exemple:
Becyk\PublicBundle\Entity\ProduitsInfo:
properties:
file:
- Image:
mimeTypes: "image/png"
mimeTypesMessage: "Que des images sous format le format png"
minWidth: 175
minWidthMessage: "175px de large précisément"
maxWidth: 175
maxWidthMessage: "175px de large précisément"
minHeight: 165
maxHeightMessage: "165px de haut précisément"
maxHeight: 165
maxHeightMessage: "165px de haut précisément"
Итак, я хотел бы сделать что-то вроде:
PublicBundle\Entity\Infos:
properties:
lien:
- Url: ~
- AdminBundle\Validator\Constraints\ContrainteUrlExist:
canBeEmpty: true
linkedin:
- Url: ~
- AdminBundle\Validator\Constraints\ContrainteUrlLinkedIn: ~
Моих классов валидации выглядеть следующим образом:
<?php
namespace AdminBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class ContrainteUrlExist extends Constraint
{
public $message = 'Cette adresse ne fonctionne pas.';
}
и:
<?php
namespace AdminBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
Class ContrainteUrlExistValidator extends ConstraintValidator
{
public function validate($url, Constraint $constraint)
{
//
/*if(empty($url)&&$canBeEmpty)
{
return;
}*/
//Valide l'url
if(!filter_var($url, FILTER_VALIDATE_URL) === false)
{
//Trouve l'host
$hostname=parse_url($url, PHP_URL_HOST);
//Tente de trouver l'adresse IP de l'host
if (gethostbyname($hostname) !== $hostname)
{
//Cherche les données de l'entête
$headers=get_headers($url);
//Tente de trouver une erreur 404
if(!strpos($headers[0], '404'))
{
return;
}
}
}
$this->context->buildViolation($constraint->message)
->setParameter('%string%', $url)
->addViolation();
}
}