2 个字段之间的 Symfony 验证
Symfony validation between 2 fields
我有一个包含 3 个字段的更改密码表单:
currentPasword
newPassword
confirmNewPassword
我想验证 newPassword
不等于当前的
我可以验证以检查它在我的 ChangePassword
表单使用的实体中是否为空,例如,使用:
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addPropertyConstraint('newPassword', new NotBlank());
}
但是我如何验证一个字段与另一个字段的对比?我是否只需要对其进行硬编码,如果需要,该代码最好放在哪里?
我会向您的用户实体添加验证器约束。这样您就可以将当前密码与新密码进行比较。当然还有 newPassword 与 confirmNewPassword。
示例:
// src/Entity/Authentification/User.php
namespace App\Entity\Authentification;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
class User
{
// here you can add assert annotations (alternatively to your loadValidatorMetaData)
/**
* @Assert\NotBlank(„Please enter current password“)
*/
private currentPassword;
private newPassword;
private confirmNewPassword;
//getter & setter go here
/**
* @Assert\Callback
*/
public function validate(ExecutionContextInterface $context, $payload)
{
if ($this->getNewPasswort() === $this->getCurrentPassword()) {
$context->buildViolation('Your new password must be different from the current Password!')
->atPath('newPassword')
->addViolation();
}
if ($this->getNewPasswort() ==! $this->getConfirmNewPassword()) {
$context->buildViolation('Your confirmed password is not equal to the new password!')
->atPath('confirmNewPassword')
->addViolation();
}
}
}
使用此自定义验证,您可以在多个字段之间进行验证。但请记住,此验证是在您提交表单后触发的。 AssertCallback 是通过在控制器中使用 $form->isValid() 触发的:
if($form->isSubmitted() && $form->isValid()).
由于违规,您可以通过以下方式捕获失败的验证:
if($form->isSubmitted() && !$form->isValid())
您可以在您的 formType 和 html 输出中处理用户对违规的反馈。
(所以看看Symfony2 : How to get form validation errors after binding the request to the form)
参考文献:
https://symfony.com/doc/current/validation/custom_constraint.html
https://symfony.com/doc/current/reference/constraints/Callback.html
希望对您有所帮助:)
我有一个包含 3 个字段的更改密码表单:
currentPasword
newPassword
confirmNewPassword
我想验证 newPassword
不等于当前的
我可以验证以检查它在我的 ChangePassword
表单使用的实体中是否为空,例如,使用:
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addPropertyConstraint('newPassword', new NotBlank());
}
但是我如何验证一个字段与另一个字段的对比?我是否只需要对其进行硬编码,如果需要,该代码最好放在哪里?
我会向您的用户实体添加验证器约束。这样您就可以将当前密码与新密码进行比较。当然还有 newPassword 与 confirmNewPassword。
示例:
// src/Entity/Authentification/User.php
namespace App\Entity\Authentification;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
class User
{
// here you can add assert annotations (alternatively to your loadValidatorMetaData)
/**
* @Assert\NotBlank(„Please enter current password“)
*/
private currentPassword;
private newPassword;
private confirmNewPassword;
//getter & setter go here
/**
* @Assert\Callback
*/
public function validate(ExecutionContextInterface $context, $payload)
{
if ($this->getNewPasswort() === $this->getCurrentPassword()) {
$context->buildViolation('Your new password must be different from the current Password!')
->atPath('newPassword')
->addViolation();
}
if ($this->getNewPasswort() ==! $this->getConfirmNewPassword()) {
$context->buildViolation('Your confirmed password is not equal to the new password!')
->atPath('confirmNewPassword')
->addViolation();
}
}
}
使用此自定义验证,您可以在多个字段之间进行验证。但请记住,此验证是在您提交表单后触发的。 AssertCallback 是通过在控制器中使用 $form->isValid() 触发的:
if($form->isSubmitted() && $form->isValid()).
由于违规,您可以通过以下方式捕获失败的验证:
if($form->isSubmitted() && !$form->isValid())
您可以在您的 formType 和 html 输出中处理用户对违规的反馈。 (所以看看Symfony2 : How to get form validation errors after binding the request to the form)
参考文献:
https://symfony.com/doc/current/validation/custom_constraint.html https://symfony.com/doc/current/reference/constraints/Callback.html
希望对您有所帮助:)