[英]Symfony 4 Custom Validator Constraint is not loading
我正在尝试在https://symfony.com/doc/current/validation/custom_constraint.html 中描述的我的 Symfony 4.4 项目中创建自定义验证器
我添加了下一个文件:
src/Validator/Constraints/PhoneNumber.php
<?php
namespace App\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class PhoneNumber extends Constraint
{
public $message = 'The string contains an illegal character: it can only contain letters or numbers.';
}
src/Validator/Constraints/PhoneNumberValidator.php
namespace App\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;
class PhoneNumberValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
dd('er wordt gevalideerd!');
if (!$constraint instanceof PhoneNumber) {
throw new UnexpectedTypeException($constraint, PhoneNumber::class);
}
// custom constraints should ignore null and empty values to allow
// other constraints (NotBlank, NotNull, etc.) take care of that
if (null === $value || '' === $value) {
return;
}
if (!is_string($value)) {
// throw this exception if your validator cannot handle the passed type so that it can be marked as invalid
throw new UnexpectedValueException($value, 'string');
// separate multiple types using pipes
// throw new UnexpectedValueException($value, 'string|int');
}
if (!preg_match('/^[a-zA-Z0-9]+$/', $value, $matches)) {
// the argument must be a string or an object implementing __toString()
$this->context->buildViolation($constraint->message)
->setParameter('{{ string }}', $value)
->addViolation();
}
}
}
配置/验证器/validation.yaml
App\Entity\AcmeEntity:
properties:
name:
- NotBlank: ~
- App\Validator\Constraints\ContainsAlphanumeric: ~
在我尝试了上述操作之后,验证器没有响应......所以我接下来尝试的是将验证器约束添加到我的实体联系人中。
源代码/实体/Contact.php
<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;
use App\Validator\Constraints as CustomAssert ;
/**
* @ApiResource()
* @ORM\Entity(repositoryClass="App\Repository\ContactRepository")
*/
class Contact
{
.....
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @CustomAssert\PhoneNumber
*/
private $phoneNumber;
这也行不通。
有人看到我做错了什么或对我可以尝试的事情有建议吗? 提前致谢!
您正在寻找的约束是否可能是从相关实体设置的? 如果是,则尝试将验证从第一个实体传递到第二个实体。
这可以通过以下方式完成:
@Assert\Valid()
不要忘记使用它:
use Symfony\Component\Validator\Constraints as Assert;
class Contact { ..... /** * @ORM\\Column(type="string", length=255, nullable=true) * @CustomAssert\\PhoneNumber */ private $phoneNumber; class Person { ..... /** * @ORM\\OneToOne(targetEntity="App\\Entity\\Contact") * @Assert\\Valid() */ private $contact;
您可以尝试在PhoneNumber
类中实现validateBy
方法。 在正常情况下,您不需要这样做,因为默认行为是查找以Validator
为后缀的相同 Constraint 名称(即PhoneNumberValidator
)。
另一个原因可能是调用ValidatorInterface
validate
方法。 也许您正在传递一些验证组(如果您可以在此处与我们共享该部分),在这种情况下,您需要在注释@CustomAssert\\PhoneNumber(groups={"some_group"})
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.