如何在Symfony 2中将参数传递给自定义验证约束

时间:2015-07-04 21:11:54

标签: php validation symfony

我正在研究检查网址是否存在的验证约束。我使它工作,但我希望能够传递一个参数,说我的网址实际上是空的,它将是O.K。

我知道您可以在Symfony 2附带的某些验证中传递参数,例如:

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

1 个答案:

答案 0 :(得分:1)

ContrainteUrlExist中,您必须定义公共属性,然后才能将它们用作参数。

相关问题