我正在研究Symfony中我的一个表单的验证。我的形式为四场;这两个首先是相同的信息,可以是任何文本或天堂空。我的第三个字段是网站的网址,第四个字段是我的网址的网址。
现在,我唯一的验证确保我的两个网址是以http或https开头的网址,但由于我的字段是网址字段,因此它已经在开头添加了它,所以它基本上是永远纠正我写的东西。诅咒,如果我没有放任何东西,它会起作用,但我希望如此。
如果有验证类可以帮助我进行更多验证,比如检查收件人是否存在,或者这些邮件是否真的是facebook的网址,我就会徘徊?
这是我的代码
形式:
<?php
namespace AdminBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
Class ModifierInfosType extends AbstractType
{
public function buildForm(FormBuilderInterface $constructeur, array $options)
{
$constructeur
->add('travailFr', 'text', array('label'=>'Travail (Fr)'))
->add('travailEn', 'text', array('label'=>'Travail (En)'))
->add('lien', 'url', array('label'=>'Lien travail'))
->add('linkedin', 'url', array('label'=>'LinkedIn'))
->add('Modifier', 'submit');
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AdminBundle\Entity\Infos',
));
}
public function getName()
{
return 'portfolio_modifier_info';
}
}
验证字段(PublicBundle \ ressources \ config \ validation.yml):
PublicBundle\Entity\Infos:
properties:
lien:
- Url:
linkedin:
- Url:
答案 0 :(得分:2)
我找到了一种方法来检查网址是否存在并且正常工作:
我做了一次认证:
<?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)
{
//Vérifie si l'url peut être vide
if(empty($url)&&$constraint->peutEtreVide)
{
return;
}
//Pattern pour trouver les url qui commence par http:// ou https://
$pattern='/^(https?:\/\/)/';
//Valide l'url et s'assure le preg_match a trouvé un match
if(filter_var($url, FILTER_VALIDATE_URL)&&!empty(preg_match($pattern, $url, $matches)))
{
//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;
}
}
}
//Crée une erreur
$this->context->buildViolation($constraint->message)
->setParameter('%string%', $url)
->addViolation();
}
}