为什么通过 AJAX 正确发送数据后 Symfony 表单是 "not submitted"?
Why the Symfony form is "not submitted" after data is correctly sent through AJAX?
我想通过 AJAX (AngularJS) 发送 Symfony 表单。
然而,即使数据被清楚地发送,表单被 Symfony 说是“未提交”(实际上没有错误,但一些调试显示 isSubmitted
returns false
)
这里是对FOSUserBundle 注册表的测试。
编辑:虽然图片看起来很小,但它们的分辨率足够高,因此如果以全尺寸显示,它们完全可读。
这是我使用来自 HTTP 表单的标准提交时的日志:
下面是我使用AJAX提交时的日志:
- 我已禁用 CSRF 令牌
- 我从 AJAX 使用的方法是“post”,所以它应该没问题,因为它是 Symfony 期望的默认方法(并且 FOSUserBundle 不会覆盖默认的 AFAIK)。
- 其他形式(在 FOSUserBundle 范围之外)使用 AJAX
正确发送
你对这件事有什么想法吗?任何指针?或者我可以检查的任何其他日志?
编辑:
我用的是default FOSUserBundle registration controller.
我几乎使用 default FOSUserBundle registration form,但我添加了一个(当前)空的 child 表单,我将在开发中进一步需要它。
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';
}
}
Headers 和以 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
Headers 与 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
我遇到了类似的问题,我在控制器内部更改了以下内容:
$user = new User();
$form = $this->createForm(
new UserRegistrationType(),
$user,
array(
'attr' => array('novalidate' => 'novalidate'),
'action' => $this->generateUrl('user_registration')
)
);
关闭 html5 错误气泡并设置操作 URL 直接对我有用。如果这不起作用,请显示您的 JS 代码。
我终于找到了更正:
正确的 URL 是 ...../register/
,最后的 /
是我在执行 AJAX 请求时忘记的。
但是,我不确定这里涉及的机制是什么。我可以调试的最深层次(当使用错误的 URL 时)是在 HttpFoundationRequestHandler
,其中 $request->getMethod()
调用返回 GET(而不是 POST),因此不提交表单.
我想通过 AJAX (AngularJS) 发送 Symfony 表单。
然而,即使数据被清楚地发送,表单被 Symfony 说是“未提交”(实际上没有错误,但一些调试显示 isSubmitted
returns false
)
这里是对FOSUserBundle 注册表的测试。
编辑:虽然图片看起来很小,但它们的分辨率足够高,因此如果以全尺寸显示,它们完全可读。
这是我使用来自 HTTP 表单的标准提交时的日志:
下面是我使用AJAX提交时的日志:
- 我已禁用 CSRF 令牌
- 我从 AJAX 使用的方法是“post”,所以它应该没问题,因为它是 Symfony 期望的默认方法(并且 FOSUserBundle 不会覆盖默认的 AFAIK)。
- 其他形式(在 FOSUserBundle 范围之外)使用 AJAX 正确发送
你对这件事有什么想法吗?任何指针?或者我可以检查的任何其他日志?
编辑:
我用的是default FOSUserBundle registration controller.
我几乎使用 default FOSUserBundle registration form,但我添加了一个(当前)空的 child 表单,我将在开发中进一步需要它。
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';
}
}
Headers 和以 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
Headers 与 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
我遇到了类似的问题,我在控制器内部更改了以下内容:
$user = new User();
$form = $this->createForm(
new UserRegistrationType(),
$user,
array(
'attr' => array('novalidate' => 'novalidate'),
'action' => $this->generateUrl('user_registration')
)
);
关闭 html5 错误气泡并设置操作 URL 直接对我有用。如果这不起作用,请显示您的 JS 代码。
我终于找到了更正:
正确的 URL 是 ...../register/
,最后的 /
是我在执行 AJAX 请求时忘记的。
但是,我不确定这里涉及的机制是什么。我可以调试的最深层次(当使用错误的 URL 时)是在 HttpFoundationRequestHandler
,其中 $request->getMethod()
调用返回 GET(而不是 POST),因此不提交表单.