Symfony 5 注册表验证不起作用

我刚刚第一次学习 Symfony。

表单验证没有按预期工作,我实际上已经按照 Symfony 文档留下了样板代码,我已经阅读了其他堆栈溢出文章和文档 10 遍,看看我是否错过了一些东西,但我无法弄清楚。

客户端验证已关闭,基本上可以很好地测试服务器端验证。但是,当提交表单时,即使表单为空且数据无效,isValid() 方法也会返回 true。我在 Entity 和 formType 中添加了约束,但它只是绕过了所有内容,我知道这一点,因为异常是由数据库或密码编码方法引发的。

发现:

当提交完全空的表单时:encodePassword() 会抛出异常,因为密码字段为 null 并且它需要字符串,(它甚至不应该进入这个阶段,因为我想象 isValid() 应该返回 false?)

使用密码和所有其他值作为空值提交:绕过所有内容,只有数据库抛出异常。

为 uniqueCode 提交错误的模式:验证器甚至无法识别任何内容并每次都通过它

handleRequest() 方法不会抛出任何异常或返回 false,除了密码,我收到一个非常丑陋的错误,说密码的参数 2 不能为空,所以显然验证没有发生, isValid() 返回 true。

错误异常来自数据库,

当我尝试插入具有错误模式的唯一代码时,插入没有问题,当名称为空时,它通过验证,但数据库抛出异常,当密码字段为空时,它仍然通过验证,

Symfony 文档说:

handleRequest() 方法将数据写回同一个对象,

然后我们验证数据:

“在上一节中,您学习了如何提交包含有效或无效数据的表单。在 Symfony 中,问题不在于“表单”是否有效,而在于底层对象(本例中的 $task)是否有效在表单应用提交的数据后有效。调用 $form->isValid() 是一个快捷方式,询问 $task 对象是否具有有效数据。

我尝试查看 ValidatorInterface 文档,但其中明确指出:“大多数时候,您不会直接与验证器服务交互,也不需要担心打印出错误。大多数时候,您将使用在处理提交的表单数据时间接验证。有关更多信息,请参阅如何验证 Symfony 表单。”

我在这里缺少什么?


慕仙森
浏览 103回答 1
1回答

叮当猫咪

这对于 Stackoverflow 来说并不是真正正确的格式,但我们可以看看在关闭之前我们能走多远。可能需要继续访问 Reddit Symfony 论坛。从小事做起,让以下行动发挥作用。请注意,没有任何实体或其他东西正在发生。只是想让自己相信验证的基础知识确实有效:class RegistrationController extends AbstractController{&nbsp; &nbsp; public function register(Request $request)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; $form = $this->createFormBuilder()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ->add('username', TextType::class, [&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'constraints' => new NotBlank(['message' => 'User name cannot be blank'])&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ])&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ->add('save', SubmitType::class, ['label' => 'Register'])&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ->getForm();&nbsp; &nbsp; &nbsp; &nbsp; $form->handleRequest($request);&nbsp; &nbsp; &nbsp; &nbsp; if ($form->isSubmitted() && $form->isValid()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dump('Validated');&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return $this->render('user/register.html.twig',['form' => $form->createView()]);&nbsp; &nbsp; }}# user/register.html.twig{% extends 'base.html.twig' %}{% block body %}&nbsp; &nbsp; <h1>Register Form</h1>&nbsp; &nbsp; {{ form_start(form, {'attr':{'novalidate':'novalidate'}}) }}&nbsp; &nbsp; {{ form_end(form) }}{% endblock %}
打开App,查看更多内容
随时随地看视频慕课网APP