我有一个列,它是一个DateTimeImmutable,当用户加入平台时保存。我正在进行phpunit测试,我想验证该列无法更新。我想在到达SQL错误之前检测错误(尝试更新列时出错)。
#[ORM\Column(updatable: false)]
#[Assert\Type(
type: 'object',
message: 'The value {{ value }} is not a valid {{ type }}.'
)]
private ?\DateTimeImmutable $joinedAt = null;
我尝试更新实体列,然后调用$manager->persist($entity)来查看当时是否有错误,但什么也没有发生。
public function testInvalidJoinedAt(): void
{
$manager = static::getContainer()->get(EntityManagerInterface::class);
// User joinedAt cannot be updated
$now = new DateTimeImmutable();
$existingUser = $this->getRepository(UserRepository::class)->find(0);
$existingUser->setJoinedAt($now);
try {
$manager->persist($existingUser);
} catch (\Throwable $err) {
$this->assertEquals('???', $err->getMessage());
}
}
像“#[Assert\NotUpdatable]”这样的Assert类型将是完美的解决方案,但没有这样的东西。
3条答案
按热度按时间o4tp2gmn1#
您可以创建自己的自定义验证器在这里 checkout 文档enter link description here在您的src/Validator/Constraints中添加文件1)
1.您可以将自定义验证器添加到实体Assert中
11dmarpk2#
Symfony Validator没有像#[Assert\NotUpdatable]这样的内置约束来处理这个特定用例。但是,您可以创建一个自定义验证约束来实现所需的功能。下面是您的操作方法:
1.创建自定义验证约束类:创建一个新的约束类,它将负责检查joinedAt属性是否正在更新。
1.创建自定义验证器类:接下来,创建一个将执行验证的自定义验证器类。
1.将自定义约束应用于实体属性:现在,将自定义NotUpdatable约束应用于实体类中的joinedAt属性:
1.更新测试以触发验证:最后,您可以更新PHPUnit测试以触发验证,并确保joinedAt属性无法更新:
此测试将确保joinedAt属性无法更新,并将验证您创建的自定义约束。如果违反了约束,它将捕获违规行为,您可以如上所示Assert错误消息。
yeotifhr3#
Doctrine不验证Symfony验证属性。您必须在保存实体之前使用Symfony验证器验证实体。
使用自定义验证器,您需要知道它是插入还是更新,因为Symfony验证器不知道您正在执行插入还是更新。这可能会创建这样的自定义验证器。但这是一个更大的努力。
我会根据你的方法
testInvalidJoinedAt()
解决它,所以你不必验证。单元测试示例