【问题标题】:Symfony Form only in backendSymfony 表单仅在后端
【发布时间】:2016-02-11 18:25:25
【问题描述】:

如何制作一个 Symfony 表单仅用于验证后端数据?数据是使用 AJAX 提交的,我已经创建了一个与数据对应的表单类,但是 $form->handleRequest($request); 由于某种原因没有提交,错误是空的,我没有任何信息,也无法找出问题所在。 将处理更改为 $form->submit($request->request->all()); 会引发类型错误,指出数据为空,但事实并非如此。

编辑:澄清一下 - 没有呈现的 HTML 表单!只有来自 POST 请求的纯数据。

【问题讨论】:

  • 请在问题中包含您的代码
  • 你想看什么代码?任何示例表单都可以,只要您不将其放入模板中并且仅提交来自 JS 的数据(例如,jQuery.post('/action', {foo: 'bar'});,而 foo 是您的实体中的一个字段)。
  • 可能是表单类的代码和控制器操作的代码。如果您遇到此问题,肯定有一些需要改进或改变的地方。
  • 如果您想手动提交表单,submit() 函数应如下所示:$form->submit($request->request->get($form->getName()));。您应该发布您的 AJAX 代码,因为我的猜测是您没有正确发送数据。您不应该只是将键和值发布到您的表单中,您应该创建一个表单,然后在 AJAX 中对其进行序列化。如果您只想发送键/值,那么您根本不应该使用表单进行验证。
  • AJAX中没有可以序列化的形式……我是这么想的;使用表单不是正确的做法,但是教我 Symfony 的同事说我必须使用它们。我想我会告诉他不。

标签: php forms symfony


【解决方案1】:

以下代码应该可以处理您的表单。

/**
 * Handles the creation form.
 *
 * @Route("/", name="demo_create")
 * @Method("POST")
 *
 */
public function createAction(Request $request)
{
    //This is optional. Do not do this check if you want to call the same action using a regular request.
    if (!$request->isXmlHttpRequest()) {
        return new JsonResponse(array('message' => 'You can access this only using Ajax!'), 400);
    }

    // Create the form
    $entity = new YourEntity();
    $form = $this->createCreateForm($entity);

    // Handle it using your request
    $form->handleRequest($request);

    // If valid, persist and flush the newly created entity
    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();

        return new JsonResponse(array('message' => 'Success!'), 200);
    }

    // Return the form with errors
    return new JsonResponse(array(
        'errors' => $form->getErrors(),
    ), 400);     
}

【讨论】:

  • 没有渲染表单,只有 AJAX 数据。天哪,每个人都试图将表单填充到模板中......
  • 大声笑,使用您问题中提供的信息真的不明显。此外,创建表单类的主要目标和默认用法是渲染它,然后处理它。我已经编辑了我的答案,只保留你需要的东西。如果不是您期望的答案,您应该在问题中添加更多信息和代码。
  • #1 - createCreateForm - 没有这种方法。 #2 - 如果我使用$this->createForm($entity);,它会抛出这个:Expected argument of type "string, Symfony\Component\Form\ResolvedFormTypeInterface or Symfony\Component\Form\FormTypeInterface", "BakingBank\Bundle\CoreBundle\Entity\TournamentInstance" given。但是您的代码很好且易于理解,因此 +1 :)
  • #1 这只是一个例子! createcreateform 是您构建表单的地方,假设您构建它。我不会添加这部分,它在文档中。 #2 如果您不显示代码,我真的无法为您提供更多帮助!祝你好运
  • 我明白了。好吧,我已经制作了一个表格,但是由于$form->handleRequest($request); 出于某种原因没有提交它,所以它不起作用。我猜在 POSTed 数据中应该还有其他内容表明表单正在提交,但那是什么 - 不知道。
猜你喜欢
  • 1970-01-01
  • 2012-03-21
  • 2021-06-09
  • 2017-11-03
  • 2014-06-23
  • 1970-01-01
  • 2018-07-13
  • 2012-01-23
  • 1970-01-01
相关资源
最近更新 更多