[英]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.