为什么Symfony表单未提交"数据通过AJAX正确发送后?

时间:2015-02-23 20:10:20

标签: ajax forms symfony fosuserbundle

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

但是,即使数据被清楚地发送,Symfony也会将表单称为“未提交”(实际上没有错误,但有些调试显示isSubmitted返回false

以下是 FOSUserBundle注册表单的测试。

编辑:虽然图片看起来很小,但它们已被充分解析,因此如果以完整尺寸显示它们,它们是完全可读的。

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

Symfony logs - HTTP form submission

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

Symfony logs - AJAX submission

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

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

编辑:

我使用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表单发送的标题和数据(注意,在接受星号之前添加了一个点,以便着色保持正确):

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请求发送的标头:(注意,在接受星号之前添加了一个点,以便着色保持正确):

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

2 个答案:

答案 0 :(得分:1)

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

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

转动html5错误气泡并设置动作网址直接对我有用。如果这不起作用,请显示您的JS代码。

答案 1 :(得分:1)

我终于设法找到了更正:

正确的网址是...../register/,最终/我在忘记AJAX请求时忘记了。

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