表格未在Symfony方面验证,可能出现什么问题?

时间:2014-12-13 17:52:34

标签: php symfony symfony-forms

我的控制器中有这个代码:

/**
 * @Secure(roles="IS_AUTHENTICATED_FULLY")
 * @Route("/rpni/registro/producto/1/guardar", name="productoGuardarPasoUno")
 * @Method("POST")
 */
public function guardarPaso1Action(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $session = $request->getSession();
    $response['success'] = false;
    $status = 400;

    if ($request->isXmlHttpRequest()) {
        $productoSolicitudRequest = $request->request->get('productoSolicitud');
        $entProductoSolicitud = $em->getRepository("AppBundle:ProductoSolicitud")->find($session->get('productoSolicitudId'));

        $entProducto = $em->getRepository("AppBundle:Producto")->find($productoSolicitudRequest['producto']['nombre']);
        $entCondicionProducto = $em->getRepository("AppBundle:CondicionProducto")->find($productoSolicitudRequest['condicion_producto']);
        $entFinalidadProducto = $em->getRepository("AppBundle:FinalidadProducto")->find($productoSolicitudRequest['finalidad_producto']);
        $entProcedenciaProducto = $em->getRepository("AppBundle:ProcedenciaProducto")->find($productoSolicitudRequest['procedencia_producto']);
        $entSolicitudUsuario = $em->getRepository("AppBundle:SolicitudUsuario")->find($session->get('solicitudUsuarioId'));

        if ($entProductoSolicitud)
        {
            $entProductoSolicitud->setProducto($entProducto);
            $entProductoSolicitud->setCondicionProducto($entCondicionProducto);
            $entProductoSolicitud->setFinalidadProducto($entFinalidadProducto);
            $entProductoSolicitud->setProcedenciaProducto($entProcedenciaProducto);
            $entProductoSolicitud->setSolicitudUsuario($entSolicitudUsuario);

            try {
                $em->flush();
            } catch (\Exception $e) {
                $response['error'] = $e->getMessage();
                return new JsonResponse($response, $status);
            }
        } else {
            $newEntProductoSolicitud = new Entity\ProductoSolicitud();
            $formProductoSolicitud = $this->createForm(new Form\ProductoSolicitudForm(), $newEntProductoSolicitud);

            if ($formProductoSolicitud->isValid())
            {
                try {
                    $em->persist($newEntProductoSolicitud);
                    $em->flush();

                    $session->set('productoSolicitudId', $newEntProductoSolicitud->getId());
                    $session->set('productoId', $entProducto->getId());
                    $response['success'] = true;

                    // Debug: remover cuando se termine el Bundle
                    $response['productoSolicitudId'] = $session->get('productoSolicitudId');
                    $response['productoId'] = $session->get('productoId');

                    $status = 200;
                } catch (Exception $ex) {
                    $response['error'] = $ex->getMessage();
                    return new JsonResponse($response, $status);
                }
            } else {
                $response['error'] = $this->get('translator')->trans('formularioNoValido');
                $response['formError'] = $this->getFormErrors($formProductoSolicitud);

                return new JsonResponse($response, $status);
            }
        }

        return new JsonResponse($response, $status);
    }
}

我尝试用于创建和更新目的。当我通过Ajax发送表单时,我从Symfony2获得了这个响应:

{
   "success":false,
   "error":"formularioNoValido",
   "formError":{
      "producto":{
         "nombre":[

         ]
      },
      "lote":[

      ],
      "procedencia_producto":[

      ],
      "finalidad_producto":[

      ],
      "condicion_producto":[

      ]
   }
}

除此之外别无他法。奇怪的是,检查Firebug中的发布标签会给我输出结果:

Parameters              application/x-www-form-urlencodedDo not sort
productoSolicitud[_token]   wC_MAeVs7ZAGSpkvLYux6RKrLq46aivxXxiCZr6pNeU
productoSolicitud[condici...    1
productoSolicitud[finalid...    1
productoSolicitud[lote] 11
productoSolicitud[procede...    1
productoSolicitud[product...    4

Source
productoSolicitud%5Bproducto%5D%5Bnombre%5D=4&productoSolicitud%5Bprocedencia_producto%5D=1&productoSolicitud%5Bfinalidad_producto%5D=1&productoSolicitud%5Bcondicion_producto%5D=1&productoSolicitud%5Blote%5D=11&productoSolicitud%5B_token%5D=wC_MAeVs7ZAGSpkvLYux6RKrLq46aivxXxiCZr6pNeU

见下图:

enter image description here

那么,错误在哪里?为什么表格无效?任何线索?指教?

2 个答案:

答案 0 :(得分:0)

如果我没有弄错,您的操作只会从此else声明中返回该响应:

else {
    $newEntProductoSolicitud = new Entity\ProductoSolicitud();
    $formProductoSolicitud = $this->createForm(new Form\ProductoSolicitudForm(), $newEntProductoSolicitud);

    if ($formProductoSolicitud->isValid())
    {
        try {
            $em->persist($newEntProductoSolicitud);
            $em->flush();

            $session->set('productoSolicitudId', $newEntProductoSolicitud->getId());
            $session->set('productoId', $entProducto->getId());
            $response['success'] = true;

            // Debug: remover cuando se termine el Bundle
            $response['productoSolicitudId'] = $session->get('productoSolicitudId');
            $response['productoId'] = $session->get('productoId');

            $status = 200;
        } catch (Exception $ex) {
            $response['error'] = $ex->getMessage();
            return new JsonResponse($response, $status);
        }
    } else {
        $response['error'] = $this->get('translator')->trans('formularioNoValido');
        $response['formError'] = $this->getFormErrors($formProductoSolicitud);

        return new JsonResponse($response, $status);
    }
}

我发现从ProductoSolicitud的新实例创建表单的有效性后,我发现这很奇怪,这真的是你想要做的吗?如果您从请求中获得了一些数据,是否不能进行此有效性检查? 也许是这样的:

if ($entProductoSolicitud)
{
    $entProductoSolicitud->setProducto($entProducto);
    $entProductoSolicitud->setCondicionProducto($entCondicionProducto);
    $entProductoSolicitud->setFinalidadProducto($entFinalidadProducto);
    $entProductoSolicitud->setProcedenciaProducto($entProcedenciaProducto);
    $entProductoSolicitud->setSolicitudUsuario($entSolicitudUsuario);

    $formProductoSolicitud = $this->createForm(new Form\ProductoSolicitudForm(), $entProductoSolicitud);
    if ($formProductoSolicitud->isValid()) {
        try {
            $em->flush();
        } catch (\Exception $e) {
            $response['error'] = $e->getMessage();
            return new JsonResponse($response, $status);
        }
    }
}

但我可能只是误解了这个问题:S

答案 1 :(得分:0)

好吧,因为我发现问题出在哪里我会自己回答,所以别人不会犯同样的错误。在我的代码中,我从不告诉表单处理请求,因此存在问题所在。 else中的代码转到此:

        } else {
            $newEntProductoSolicitud = new Entity\ProductoSolicitud();
            $formProductoSolicitud = $this->createForm(new Form\ProductoSolicitudForm(), $newEntProductoSolicitud);

            $formProductoSolicitud->handleRequest($request);  

            if ($formProductoSolicitud->isValid())
            {
                ...
            } catch (Exception $ex) {
                    $response['error'] = $ex->getMessage();
                    return new JsonResponse($response, $status);
                }
            } else {
                ....
            }
        }

        return new JsonResponse($response, $status);
    }
}

这就是全部,快乐的编码!!