Hi,

wir würden gerne Symfony Form und Twig verwenden, um im Frontend Formulare zu generieren. Unter Verwendung von Entity und Repository. Das Script läuft soweit, dass die Form ausgegeben wird, aber beim Submit meldet Contao, dass das Token nicht stimmt. Wie kann man in die Form das Request Token von Contao richtig integrieren?

PHP-Code:
<?php

namespace App\Controller\FrontendModule;

use 
App\Entity\Produkt;
use 
App\Form\Type\ProduktType;
use 
App\Repository\ProduktRepository;
use 
Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController;
use 
Contao\CoreBundle\Exception\RedirectResponseException;
use 
Contao\CoreBundle\ServiceAnnotation\FrontendModule;
use 
Contao\ModuleModel;
use 
Contao\PageModel;
use 
Contao\Template;
use 
Doctrine\DBAL\Connection;
use 
Doctrine\Persistence\ManagerRegistry;
use 
Symfony\Component\Form\Extension\Core\Type\HiddenType;
use 
Symfony\Component\Form\FormFactoryInterface;
use 
Symfony\Component\HttpFoundation\Request;
use 
Symfony\Component\HttpFoundation\Response;
use 
Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;

/**
 * @FrontendModule(category="miscellaneous")
 */
class MyFrontendModuleController extends AbstractFrontendModuleController
{

  
/**
   * @var ManagerRegistry
   */
  
private $managerRegistry;
  
/**
   * @var FormFactoryInterface
   */
  
private $formFactory;
  
/**
   * @var CsrfTokenManagerInterface
   */
  
private $csrfTokenManager;

  public function 
__construct(ManagerRegistry $managerRegistryFormFactoryInterface $formFactoryCsrfTokenManagerInterface $csrfTokenManager) {

    
$this->managerRegistry $managerRegistry;
    
$this->formFactory $formFactory;
    
$this->csrfTokenManager $csrfTokenManager;
  }

  protected function 
getResponse(Template $templateModuleModel $modelRequest $request): Response {

    
$entityManager $this->managerRegistry->getManager();

    
//    if ($request->isMethod('post')) {
    //      echo "<span style='color: red'><br>TEST :: " . basename(__FILE__) . " " . __LINE__ . " -> </span>";
    //      if (null !== ($redirectPage = PageModel::findByPk($model->jumpTo))) {
    //        throw new RedirectResponseException($redirectPage->getAbsoluteUrl());
    //      }
    //    }

    
$form $this->formFactory->createBuilder(ProduktType::class)->getForm();

    
$form->handleRequest($request);
    if (
$form->isSubmitted() && $form->isValid()) {
      
$Produkt $form->getData();

      
$entityManager->persist($Produkt);
      
$entityManager->flush();
      return 
$this->redirect($request->getUri());
    }

    
$template->form $form->createView();

    
$template->action $request->getUri();

    return 
$this->renderForm('base.html.twig', [
      
'form' => $form
    
]);

    return 
$template->getResponse();
  }
}
Twig template
PHP-Code:
{{ form(form) }} 
PHP-Code:
<?php

namespace App\Form\Type;

use 
App\Entity\Produkt;
use 
Symfony\Component\Form\AbstractType;
use 
Symfony\Component\Form\Extension\Core\Type\DateType;
use 
Symfony\Component\Form\Extension\Core\Type\SubmitType;
use 
Symfony\Component\Form\Extension\Core\Type\TextType;
use 
Symfony\Component\Form\FormBuilderInterface;
use 
Symfony\Component\OptionsResolver\OptionsResolver;
use 
Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;

class 
ProduktType extends AbstractType
{

  
/**
   * @var CsrfTokenManagerInterface
   */
  
private $csrfTokenManager;

  public function 
__construct(CsrfTokenManagerInterface $csrfTokenManager) {
    
$this->csrfTokenManager $csrfTokenManager;
  }

  public function 
configureOptions(OptionsResolver $resolver) {
    
parent::configureOptions($resolver); // TODO: Change the autogenerated stub
    
$resolver->setDefaults([
      
'data_class' => Produkt::class,
      
'csrf_field_name' => 'REQUEST_TOKEN',
      
'csrf_token_id' =>   $this->csrfTokenManager->getToken('REQUEST_TOKEN')
    ]);
  }

  public function 
buildForm(FormBuilderInterface $builder, array $options): void
  
{
    
$builder
      
->add('name'TextType::class)
      ->
add('strasse'TextType::class)
      ->
add('save'SubmitType::class)
    ;
  }
}