简体   繁体   English

Symfony 419 状态错误 AJAX 表单帖子

[英]Symfony 419 status error on AJAX form post

I was posting a Symfony form via AJAX post and after I made a field edit on my "Siparis" entity and related form field in "SiparisType" I keep getting 419 on post.我通过 AJAX 帖子发布了 Symfony 表单,在我对“Siparis”实体和“SiparisType”中的相关表单字段进行字段编辑后,我在帖子中不断收到 419。

Symfony version: 6.0.2 - PHP version:8.1.2 Database: 10.4.22-MariaDB Symfony 版本:6.0.2 - PHP 版本:8.1.2 数据库:10.4.22-MariaDB

I tried to disable csrf protection and still getting the same status 419 and nothing else.我试图禁用 csrf 保护,但仍然获得相同的状态 419,没有别的。 Symfony route to handle AJAX post(I reverted my latest changes after editing the field below version was working fine earlier): Symfony 路由来处理 AJAX 帖子(我在编辑以下版本的字段后恢复了我的最新更改,之前工作正常):

#[Route('/save/', name: 'save', methods: ['POST'])]
public function save_siparis(Request $request, EntityManagerInterface $entityManager): JsonResponse
{
    $siparis = new Siparis();
    try {
        $form = $this->createForm(SiparisType::class, $siparis);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $entityManager->persist($siparis);
            $entityManager->flush();

            return new JsonResponse(['result' => 'OK', 'siparis_id' => $siparis->getId()]);
        }
    }catch(\Exception $e){
        error_log($e->getMessage());
        return new JsonResponse(array('result' => $e->getMessage()), 419);
    }
}

Render Form route on Controller: Only change is: 'firma' => $id option for form in this section在 Controller 上渲染表单路由:唯一的变化是:'firma' => 本节中表单的 $id 选项

#[Route('/new/{id}', name: 'new', methods: ['GET'])]
public function new($id, Request $request, EntityManagerInterface $entityManager, SiparisRepository $siparisRepository,FirmaRepository $firmaRepository, IlgiliRepository $ilgiliRepository): Response
{
    $siparis = new Siparis();
    $latest_siparis = $siparisRepository->findBy(['Musteri' => $id], ['id' => 'desc', ]);
    $siparis_id = 1;
    if(!is_null($latest_siparis))
        $siparis_id = count($latest_siparis) + 1;


    $musteri = $firmaRepository->find($id);
    $siparisNo = 'TST-'.str_replace(' ', '-',$musteri->getKod()).'-'.str_pad($siparis_id, 3, '0', STR_PAD_LEFT);
    $form = $this->createForm(SiparisType::class, $siparis, ['firma' => $id,'attr' => ['id' => 'siparis_form']]);
    $firmalar = $firmaRepository->findBy(['Type' => 0]);
    $maliyet = new Maliyetler();
    $maliyet_form = $this->createForm(MaliyetlerType::class, $maliyet, ['attr' => ['id' => 'maliyet_form']]);
    
    return $this->renderForm('siparis/new.html.twig', [
        'siparisNo' => $siparisNo,
        'sipari' => $siparis,
        'form' => $form,
        'maliyet_form' => $maliyet_form,
        'satici_firmalar' => $firmalar,
        'musteri' => $musteri,
        'mode' =>'NEW'
    ]);
}

My FormType: The field: 'siparis_veren' was a TextType and i have changed this one as a EntityType and fetched the related entities via query builder我的 FormType:字段:'siparis_veren' 是 TextType,我已将其更改为 EntityType,并通过查询生成器获取相关实体

public function buildForm(FormBuilderInterface $builder, array $options): void
{
    $firma = $options['firma'];
    $SIPARIS_CHOICES = ['Devam Ediyor' => '1','Tamamlandı' => '2','İptal' => '3'];
    $builder
        ->add('teslim_tarihi', DateType::class, [
            'widget' => 'single_text',
            'label' => 'Teslim Tarihi', 'attr' =>['class' => 'form-control', 'placeholder' => 'Teslim Tarihi']
        ])
        ->add('siparis_tarihi', DateType::class, [
            'widget' => 'single_text',
            'label' => 'Sipariş Tarihi', 'attr' =>['class' => 'form-control', 'placeholder' => 'Sipariş Tarihi']
        ])
        ->add('siparis_veren', EntityType::class,['class' => Ilgili::class,
            'choice_label' => 'full_name',
            'query_builder' => function (EntityRepository $er) use ($firma) {
                return $er->createQueryBuilder('ilgili')
                    ->andWhere('ilgili.firma = :firma')
                    ->setParameter('firma', $firma);
            },
            'label' => 'Siparişi Veren', 'attr' =>['class' => 'form-control', 'placeholder' => 'Siparişi Veren']])
        ->add('siparis_durum', ChoiceType::class,['choices' => $SIPARIS_CHOICES,'attr' =>['class' => 'form-control', 'placeholder' => 'Siparişi Alan'] ])
        ->add('siparis_turu', HiddenType::class)
        ->add('siparis_genel_aciklama', TextType::class,['label' => 'Sipariş Genel Açıklaması', 'attr' =>['class' => 'form-control', 'placeholder' => 'Sipariş Genel Açıklaması']])
        ->add('siparis_satir_aciklama', HiddenType::class)
        ->add('siparis_miktari', HiddenType::class)
        ->add('siparis_fiyati', HiddenType::class)
        ->add('fatura_durumu', HiddenType::class)
        ->add('siparisNo', HiddenType::class)
        ->add('siparis_kdv_orani', HiddenType::class);
}

public function configureOptions(OptionsResolver $resolver): void
{
    $resolver->setDefaults([
        'data_class' => Siparis::class,
        'csrf_protection' => true,
        'csrf_field_name' => '_token',
    ]);
    $resolver->setRequired(['firma']);
}

My AJAX form post on client side(No change here):我的 AJAX 表单在客户端发布(此处没有更改):

$('form[name="siparis"]').submit(function(e) {
        e.preventDefault();

        var url = "{{ path('siparis_save') }}";
        var formSerialize = $(this).serialize();
        $.post(url, formSerialize, function(response) {
            if(response.result === "OK")
            {
                $( 'form[name="maliyetler"]' ).submit();
            }
            else
            {
                console.log(response.result);
            }

        }, 'JSON');
    });

In my Siparis Entity siparis_veren was a text field and i added a ManyToOne relation with Ilgili class to it and after my changes post keep giving me 419 error.在我的 Siparis 实体中,siparis_veren 是一个文本字段,我添加了一个与 Ilgili class 的多对一关系,在我的更改后继续给我 419 错误。

#[ORM\ManyToOne(targetEntity: Ilgili::class, inversedBy: 'siparisler')]
#[ORM\JoinColumn(nullable: false)]
private $siparis_veren;

I tried clearing cache, removed related siparis_veren field from form type and controller but result is same unless I revert siparis_veren to TextType as it was before.我尝试清除缓存,从表单类型和 controller 中删除相关的 siparis_veren 字段,但结果是相同的,除非我将 siparis_veren 恢复为以前的 TextType。

Sorry if my explanation is not enough, I couldn't find any results regarding this issue and SO is my only choice, I am a newbie in Symfony.对不起,如果我的解释不够,我找不到任何关于这个问题的结果,所以是我唯一的选择,我是 Symfony 的新手。

Thank you.谢谢你。

Okay found the issue, I didn't notice that I set status to 419 on Try Catch catch block so thought it was about Symfony or client side.好的,找到了问题,我没有注意到我在 Try Catch catch 块上将状态设置为 419,所以认为它与 Symfony 或客户端有关。 After doing some debugging I get "An error has occurred resolving the options of the form "App\Form\SiparisType": The required option "firma" is missing."进行一些调试后,我得到“解决“App\Form\SiparisType”表单选项时发生错误:缺少所需的选项“firma”。 error which is caused by错误是由

SiparisConroller.php SiparisConroller.php

$form = $this->createForm(SiparisType::class, $siparis);

This line in save_siparis() function. save_siparis() function 中的这一行。 In SiparisType I have set 'firma' field as required SiparisType.php在 SiparisType 中,我根据需要设置了“firma”字段 SiparisType.php

$resolver->setRequired(['firma']);

Therefore I got an error in Try Catch block.因此我在 Try Catch 块中遇到错误。

Thanks to @jean-max for his advice to check Try Catch.感谢@jean-max 提出的检查 Try Catch 的建议。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM