Symfony 4.2 Форма не отправлена ​​или не действительна - PullRequest
0 голосов
/ 20 января 2019

Я следовал документации 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;

Как вы видите, я использую аннотации Assert для проверок.

Итак, вот тип формы:

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) }}

Далее здесь контроллер, который получает запрос.

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

Ошибки дают мне пустой массив в формате Json. Если я проверяю dump($feedbackForm), я вижу, что свойство submitted имеет значение false. и значения modeldata, viewdata и normdata равны нулю ... Но как это возможно?

Запрос на сброс:

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

Я думаю, это правильно.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вы не загрузили данные формы в объект и пытаетесь сохранить новый пустой отзыв.

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

0 голосов
/ 20 января 2019

Создавали ли вы свой FeedbackType, Controller action и представление формы вручную? Удалить все и использовать

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) }}
...