繁体   English   中英

自定义约束和验证器但[ERROR]约束验证器不存在

[英]Custom constraint and validator but [ERROR] Constraint validator does not exist

我正在尝试使用自定义约束及其验证器创建自己的服务。

MailAlert实体:

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;
use AppBundle\Validator\AntiBadMail;

/**
 * MailAlert
 *
 * @ORM\Table(name="mail_alert")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\MailAlertRepository")
 * @UniqueEntity(fields="mail", message="Cette adresse a déjà été enregistrée.") 
 */
class MailAlert
{
    /**
     * @var string
     *
     * @ORM\Column(name="Mail", type="string", length=255)
     * @Assert\Email
     * @AntiBadMail()
     */
    private $mail;
}

AntiBadMail约束:

namespace AppBundle\Validator;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation 
 */
class AntiBadMail extends Constraint
{
    public function validatedBy()
    {
        return 'app.validator_antibadmail'; // Ici, on fait appel au service
    }
}

AntiBadMailValidator:

namespace AppBundle\Validator;

use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class AntiBadMailValidator extends ConstraintValidator
{
    private $requestStack;
    private $em;

    public function __construct(RequestStack $requestStack, EntityManagerInterface $em)
    {
        $this->requestStack = $requestStack;
        $this->em           = $em;
    }

    public function validate($value, Constraint $constraint)
    {
        $request = $this->requestStack->getCurrentRequest();

        $mail = $request->request->all()['form']['mail'];
        $listPiecesOfMail = explode("@", $mail);

        $mailBefore = $listPiecesOfMail[0];
        $mailAfter = $listPiecesOfMail[1];

        $ListAcceptedMails = $this->container->getParameters('listAcceptedMails');

        if(count($mailBefore)<3){
            $this->context->addViolation($constraint->messageBefore);
        }

        if(!preg_match('#'.implode('|',$ListAcceptedMails).'#', $mailAfter)){
            $this->context->addViolation($constraint->messageAfter);
        }
    }
}

服务配置:

app.validator_antibadmail:
      class: AppBundle\Validator\AntiBadMailValidator
      arguments: 
          - "@request_stack"
          - "@doctrine.orm.entity_manager"

我不知道为什么但是我得到的错误比我的验证器不存在。 我使用validatedBy() ,并给它正确的名称。

我搞不清楚了。 你能帮助我吗 ?

编辑:这是错误:

约束验证程序“app.validator_antibadmail”不存在或未启用。 检查约束类“AppBundle \\ Validator \\ AntiBadMail”中的“validatedBy”方法。

起来! 我使用@Asserts / Email完成,但如果有人有想法,我准备好了!

对于仍然面临此问题的任何人,这是使用Symfony 3.4配置Validator服务的方式:

AppBundle\Validator\Constraints\CustomValidator:
    public: true
    class: AppBundle\Validator\Constraints\CustomValidator
    autowire: true
    tags: [{ name: validator.constraint_validator, alias: app.validator.custom }]

其他所有内容都应该按照问题中的描述完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM