Php 如何将参数传递到Symfony 2中的自定义验证约束
我正在处理一个验证约束,该约束检查url是否存在。我让它工作,但我想能够传递一个参数,说我的url实际上可以是空的,这将是好的 我知道您可以在Symfony 2附带的一些验证中传递参数,例如:Php 如何将参数传递到Symfony 2中的自定义验证约束,php,validation,symfony,Php,Validation,Symfony,我正在处理一个验证约束,该约束检查url是否存在。我让它工作,但我想能够传递一个参数,说我的url实际上可以是空的,这将是好的 我知道您可以在Symfony 2附带的一些验证中传递参数,例如: Becyk\PublicBundle\Entity\ProduitsInfo: properties: file: - Image: mimeTypes: "image/png" mimeTyp
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.';
}
在containerlexist
中,必须定义公共属性,然后才能将它们用作参数
<?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();
}
}