如何让jquery返回csrf?
阅读这个Symfony CSRF和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(), ));
然后在我的表单模板中我有:
$.ajax({ url: "app.php", type: 'POST', data: { form: { _token: "{{ csrf_token('form') }}" } }, }); {{ form_start(form, {'method': 'POST', 'action': 'app.php'}) }} {{ form_row(form.task, {'required': false}) }} {{ form_end(form, {'render_rest': false}) }}
当我查看我的源代码时,我看到:
$.ajax({ url: "app.php", type: 'POST', data: { form: { _token: "Kf1IK4uikxPCxfmjUkDa8vhRiNI4PWS2zdnTIiWyHC4" } }, });
因此令牌生成但是当我打印调试时,我没有看到_token被发布。 我做错了什么?
您可以按照链接的答案中的描述序列化表单,也可以仅发送令牌
仅限令牌:
$.ajax({ url: "{{ path('your_edit_route') }}", type: 'POST', data: { form: { _token: "{{ csrf_token('form') }}" } }, });
整体forms:
var data = $('#targetForm').serialize(); $.ajax({ url: "{{ path('your_edit_route') }}", type: 'POST', data: data, });