读取这个Symfony CSRF and Ajax它只返回csrf,但是如何将jQuery返回到表单中呢?
编辑:我的代码如下:
$formFactory = Forms::createFormFactoryBuilder()
->addExtension(new CsrfExtension($csrfManager))
->getFormFactory();
$defaultFormTheme = 'bootstrap_3_layout.html.twig';
$vendorDir = realpath(__DIR__.'/../vendor');
$appVariableReflection = new \ReflectionClass('\Symfony\Bridge\Twig\AppVariable');
$vendorTwigBridgeDir = dirname($appVariableReflection->getFileName());
$viewsDir = realpath('twig');
$twig = new Twig_Environment(new Twig_Loader_Filesystem(array(
$viewsDir,
$vendorTwigBridgeDir.'/Resources/views/Form',
)));
$formEngine = new TwigRendererEngine(array($defaultFormTheme), $twig);
$twig->addRuntimeLoader(new \Twig_FactoryRuntimeLoader(array(
TwigRenderer::class => function () use ($formEngine, $csrfManager) {
return new TwigRenderer($formEngine, $csrfManager);
},
)));
$twig->addExtension(new FormExtension());
$translator = new Translator('en');
$twig->addExtension(new TranslationExtension($translator));
$form = $formFactory->createBuilder()
->add('task', TextType::class)
->add('dueDate', DateType::class)
->getForm();
$request = Request::createFromGlobals();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
print_r($data);
}
$twig->display('new.html.twig', array(
'form' => $form->createView(),
));
然后在我的表单模板中,我有:
<script src="https://code.jquery.com/jquery-3.2.1.min.js" type="text/javascript"></script>
<script>
$.ajax({
url: "app.php",
type: 'POST',
data: {
form: {
_token: "{{ csrf_token('form') }}"
}
},
});
</script>
</head>
<body>
{{ form_start(form, {'method': 'POST', 'action': 'app.php'}) }}
{{ form_row(form.task, {'required': false}) }}
<input type="submit" />
{{ form_end(form, {'render_rest': false}) }}
当我查看我的源代码时,我看到:
<script>
$.ajax({
url: "app.php",
type: 'POST',
data: {
form: {
_token: "Kf1IK4uikxPCxfmjUkDa8vhRiNI4PWS2zdnTIiWyHC4"
}
},
});
</script>
<form name="form" method="post" action="app.php">
<div class="form-group"><label class="control-label" for="form_task">Task</label><input type="text" id="form_task" name="form[task]" class="form-control" value="qqq" /></div>
<input type="submit" />
</form>
因此生成令牌但是当我打印调试时,我没有看到_token被发布。我做错了什么?
答案 0 :(得分:0)
您可以按照链接的答案中的描述序列化表单,也可以只发送令牌
仅限令牌:
$.ajax({
url: "{{ path('your_edit_route') }}",
type: 'POST',
data: {
form: {
_token: "{{ csrf_token('form') }}"
}
},
});
整个表格:
var data = $('#targetForm').serialize();
$.ajax({
url: "{{ path('your_edit_route') }}",
type: 'POST',
data: data,
});