Symfony 4.2表格未提交或无效
我遵循了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
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 { ...