繁体   English   中英

Symfony 419 状态错误 AJAX 表单帖子

[英]Symfony 419 status error on AJAX form post

我通过 AJAX 帖子发布了 Symfony 表单,在我对“Siparis”实体和“SiparisType”中的相关表单字段进行字段编辑后,我在帖子中不断收到 419。

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

我试图禁用 csrf 保护,但仍然获得相同的状态 419,没有别的。 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);
    }
}

在 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'
    ]);
}

我的 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']);
}

我的 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');
    });

在我的 Siparis 实体中,siparis_veren 是一个文本字段,我添加了一个与 Ilgili class 的多对一关系,在我的更改后继续给我 419 错误。

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

我尝试清除缓存,从表单类型和 controller 中删除相关的 siparis_veren 字段,但结果是相同的,除非我将 siparis_veren 恢复为以前的 TextType。

对不起,如果我的解释不够,我找不到任何关于这个问题的结果,所以是我唯一的选择,我是 Symfony 的新手。

谢谢你。

好的,找到了问题,我没有注意到我在 Try Catch catch 块上将状态设置为 419,所以认为它与 Symfony 或客户端有关。 进行一些调试后,我得到“解决“App\Form\SiparisType”表单选项时发生错误:缺少所需的选项“firma”。 错误是由

SiparisConroller.php

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

save_siparis() function 中的这一行。 在 SiparisType 中,我根据需要设置了“firma”字段 SiparisType.php

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

因此我在 Try Catch 块中遇到错误。

感谢@jean-max 提出的检查 Try Catch 的建议。

暂无
暂无

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

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