在Symfony 2中验证URL的最佳方法

时间:2015-07-03 02:14:41

标签: forms validation symfony

我正在研究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:

1 个答案:

答案 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();
    }
}