Symfony 4.2表单未提交或无效

时间:2019-01-20 15:54:54

标签: symfony symfony-forms symfony4

我遵循了symfony 4.2文档,但似乎未提交表格...

我度过了整个星期天,但是这是一个秘密的工作,在日志中我看不到任何错误。

所以开始吧。该配置包含以下设置:

IBindingList

在此实体:

framework:
    validation:
        email_validation_mode: 'html5'
        enable_annotations: true

您可以看到我使用Assert批注进行验证。

所以这是表单类型:

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格式的空数组。 如果我检查/** * @Route("/feedback", name="feedback", methods="GET|POST") */ public function feedbackFormAction(Request $request, EntityManagerInterface $entityManager): JsonResponse { $feedbackForm = new Feedback(); $form = $this->createForm(FeedbackType::class, $feedbackForm); $form->handleRequest($request); dump($request); dump($feedbackForm); if ($form->isSubmitted() && $form->isValid()) { $entityManager->persist($feedbackForm); $entityManager->flush(); } else { $errors = $this->getErrorsFromForm($form); dump($form);die; return new JsonResponse(['data' => ['result' => 'failed', 'errors' => $errors]]); } return new JsonResponse(['data' => ['result' => 'success']]); } ,则会看到dump($feedbackForm)属性为false。并且submittedmodeldataviewdata的值为空...但这怎么可能?

倾销请求:

normdata

我认为这是正确的。

2 个答案:

答案 0 :(得分:0)

您是否手动创建了FeedbackType,Controller操作和表单视图? 删除所有并使用

php bin/console make:crud Feedback

这将生成操作文件:-)

我认为使用 form_row 很适合使用 form_widget

您的控制器

/**
 * @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) }}

答案 1 :(得分:0)

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

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

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

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

仔细阅读https://symfony.com/doc/current/forms.html#handling-form-submissions