【问题标题】:Why the Symfony form is "not submitted" after data is correctly sent through AJAX?为什么通过 AJAX 正确发送数据后 Symfony 表单“未提交”?
【发布时间】:2015-02-23 20:10:20
【问题描述】:

我想通过 AJAX (AngularJS) 发送 Symfony 表单。

但是,即使数据被明确发送,Symfony 说表单是“未提交”(实际上没有错误,但一些调试显示isSubmitted 返回false

这是对FOSUserBundle 注册表单的测试。

编辑:虽然图片看起来很小,但它们的分辨率足够高,因此如果以全尺寸显示,它们是完全可读的。

以下是我使用来自 HTTP 表单的标准提交时的日志:

以下是我使用 AJAX 提交时的日志:

  • 我已禁用 CSRF 令牌
  • 我在 AJAX 中使用的方法是“post”,所以应该没问题,因为它是 Symfony 所期望的默认值(并且 FOSUserBundle 不会覆盖默认的 AFAIK)。
  • 其他表单(FOSUserBundle 范围之外)使用 AJAX 正确发送

你对这件事有什么想法吗?任何指针?或者我可以检查的任何其他日志?

编辑:

我使用default FOSUserBundle registration controller

我几乎使用default FOSUserBundle registration form,但我添加了一个(当前)空子表单,我将在开发中进一步使用它。

namespace NONG\SecurityBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class UserRegistrationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options) {}

    public function getParent() {
        return 'fos_user_registration';
    }

    public function getName() {
        return 'nong_user_registration';
    }
}

与 HTML 表单一起发送的标题和数据(注意,在 Accept 中的星号前添加了一个点,以便颜色保持正确):

POST /server/web/testfosuser/register/ HTTP/1.1
Host: mywebsite.com
Connection: keep-alive
Content-Length: 229
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/.*;q=0.8
Origin: http://mywebsite.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36         (KHTML, like Gecko) Chrome/40.0.2214.111             Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://mywebsite.com/server/web/testfosuser/register/
Accept-Encoding: gzip, deflate
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: PHPSESSID=xxxxxxxxxxxxxxxxxxxxxxxxx


fos_user_registration_form%5Bemail%5D=bidon%40bidon.com&
fos_user_registration_form%5Busername%5D=bidon&
fos_user_registration_form%5BplainPassword%5D%5Bfirst%5D=bidon&
fos_user_registration_form%5BplainPassword%5D%5Bsecond%5D=bidon

与 AJAX 请求一起发送的标头:(注意。在 Accept 中的星号之前添加了一个点,以便颜色保持正确):

POST /server/web/testfosuser/register HTTP/1.1
Host: mywebsite.com
Connection: keep-alive
Content-Length: 229
Accept: application/json, text/plain, */.*
Origin: http://mywebsite.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36
Content-Type: application/json;charset=UTF-8 application/x-www-form-urlencoded; charset=UTF-8
Referer: http://mywebsite.com/client/
Accept-Encoding: gzip, deflate
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: PHPSESSID=xxxxxxxxxxxxxxxxxxxxxxxxx

fos_user_registration_form%5Bemail%5D=bidonqdsfqsdf%40qsdf&
fos_user_registration_form%5Busername%5D=charles222&
fos_user_registration_form%5BplainPassword%5D%5Bfirst%5D=bidon&
fos_user_registration_form%5BplainPassword%5D%5Bsecond%5D=bidon

【问题讨论】:

  • 您能否展示您的表单代码、控制器代码以及 chrome 网络选项卡捕获的两种情况下的请求标头和正文?
  • 我已经编辑了问题。

标签: ajax forms symfony fosuserbundle


【解决方案1】:

我遇到了类似的问题,我在控制器内部更改了以下内容:

$user    = new User();
$form    = $this->createForm(
    new UserRegistrationType(),
    $user,
    array(
        'attr' => array('novalidate' => 'novalidate'),
        'action' => $this->generateUrl('user_registration')
    )
 );

打开 html5 错误气泡并直接设置操作 URL 对我有用。如果这不起作用,请显示您的 JS 代码。

【讨论】:

  • 谢谢。可以肯定的是,我必须用您的代码替换当前的$form = $formFactory->createForm();?您能否进一步解释一下为什么这有效(尚未对我进行测试)?
  • 我不知道你能不能做到,我不知道你的控制器长什么样。但是如果你想使用你的代码,只需设置动作路径。默认情况下它只是action="",在我的情况下,这是通过ajax提交它的问题。
【解决方案2】:

我终于找到了更正:

正确的 URL 是 ...../register/,最后是 /,我在执行 AJAX 请求时忘记了它。

但是,我不确定这里的机制是什么。我可以调试的最深入(使用错误的 URL 时)是在 HttpFoundationRequestHandler 中,$request->getMethod() 调用返回 GET(而不是 POST),因此不提交表单。

【讨论】:

  • 快速浏览一下,我认为是为了防止在您处理或仅在同一页面中显示表单时触发“提交机制”。
猜你喜欢
  • 2011-04-01
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多