Symfony 4.2表格未提交或无效

Symfony 4.2表格未提交或无效,symfony,symfony-forms,symfony4,Symfony,Symfony Forms,Symfony4,我遵循了symfony 4.2文档,但似乎没有提交表单 我花了整个星期天,但它似乎是一个秘密如何工作,在日志中我没有看到任何错误 那就开始吧。配置包含以下设置: framework: validation: email_validation_mode: 'html5' enable_annotations: true 在此,实体: namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Sy

我遵循了symfony 4.2文档,但似乎没有提交表单

我花了整个星期天,但它似乎是一个秘密如何工作,在日志中我没有看到任何错误

那就开始吧。配置包含以下设置:

framework:
    validation:
        email_validation_mode: 'html5'
        enable_annotations: true
在此,实体:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass="App\Repository\FeedbackRepository")
 */
class Feedback extends BaseEntity
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\Type("string")
     * @Assert\NotBlank
     */
    private $name;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\Type("string")
     * @Assert\Email()
     * @Assert\NotBlank
     */
    private $email;
如您所见,我使用断言注释进行验证

所以这里的表单类型:

class FeedbackType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class)
            ->add('email', EmailType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Feedback::class,
            // enable/disable CSRF protection for this form
            'csrf_protection' => true,
            // the name of the hidden HTML field that stores the token
            'csrf_field_name' => '_token',
        ]);
    }
}
也许是代币的问题,但我不太清楚

现在让我们看看这个视图:

 <form action="{{ path('feedback') }}" type="POST">
                        <div class="input-field">
                            <i class="material-icons prefix">account_circle</i>
                            {{ form_label(feedback.name) }}
                            {{ form_widget(feedback.name) }}
                        </div>
                        <div class="input-field">
                            <i class="material-icons prefix">email</i>
                            {{ form_label(feedback.email) }}
                            {{ form_widget(feedback.email) }}
                        </div>
{{ form_widget(feedback._token) }}
这些错误给了我一个Json格式的空数组。 如果我检查dump$feedbackForm,我会看到提交的属性为false。并且modeldata、viewdata和normdata值为null。。。但这怎么可能呢

倾销申请:

query: ParameterBag {#16 ▼
    #parameters: array:1 [▼
      "feedback" => array:11 [▼
        "name" => "a"
        "email" => "a@a.a"
        "_token" => "NJHBv7NpwYlugFcU-sE0qoBEQkS38yhxOjbklkHu8j0"
      ]
    ]
  }

我认为,这是正确的。

您是否手动创建了反馈类型、控制器操作和表单视图? 移除所有的并使用

php bin/console make:crud Feedback
这将生成操作文件:-

我认为使用form_行比使用form_小部件更合适

你的控制器

/**
 * @Route("/feedback", name="feedback", methods="GET|POST")
 */
public function feedbackFormAction(Request $request, EntityManagerInterface $entityManager): JsonResponse
{
    $feedback = new Feedback();

    $form = $this->createForm(FeedbackType::class, $feedback);
    $form->handleRequest($request);

    if ($form->isSubmitted()) {
        if ($form->isValid()) {
            $entityManager->persist($feedbackForm);
            $entityManager->flush();
            return new JsonResponse(['data' => ['result' => 'success']]);
        }
        else {
            $errors = $this->getErrorsFromForm($form);
            return new JsonResponse(['data' => ['result' => 'failed', 'errors' => $errors]]);
        }
    }

    return $this->render('path_to_your_feed_back.html.twig', [
        'feedback' => $feedback,
        'form' => $form->createView(),
    ]);
}
你的form.html.twig

{{ form_start(form, {'method': 'POST', 'attr' : {'class' : 'formFeedback'}}) }}
    <div class="input-field">
        <i class="material-icons prefix">account_circle</i>
        {{ form_row(form.name) }}
    </div>
    <div class="input-field">
        <i class="material-icons prefix">email</i>
        {{ form_row(form.email) }}
    </div>
{{ form_end(form) }}

您尚未将表单数据加载到实体中并尝试保留空的新反馈

if ($form->isSubmitted() && $form->isValid()) {

    // add line below
    $feedbackForm = $form->getData();

    $entityManager->persist($feedbackForm);
    $entityManager->flush();
} else { ...

仔细阅读

是的,我使用了Crud操作,并修改为使用json响应和自定义form_小部件。我认为使用form_row与使用form_小部件{{form_startfeedback,{'method':'POST','attr':{'class':'formFeedback'}}}}帐户{{form rowfeedback.name}比较合适电子邮件{{form_rowfeedback.email}{{form_endfeedback}}我已经编辑了我的答案!我看不出您将生成的反馈表单从控制器发送到表单视图的位置!您不必使用相同的操作渲染视图[如果我真的理解您在这里的逻辑]。因此,HandlerRequest未映射到当前操作的请求。
if ($form->isSubmitted() && $form->isValid()) {

    // add line below
    $feedbackForm = $form->getData();

    $entityManager->persist($feedbackForm);
    $entityManager->flush();
} else { ...