使用 FosrestBundle 构建表单时在 Symfony3 中使用 "not required"
Use "not required" in Symfony3 when building forms with FosrestBundle
我正在使用 FosrestBundle 和 Symfony3 构建一个 API。在我工作的某些部分,我必须构建表单,并且我希望我的表单的某些字段设置为 "not required"。但是当我尝试创建它们时出现错误。
以下是我如何为我的实体之一创建表单:"Question"。
首先,我创建了一个 QuestionType class,我将 required 设置为 false:
class QuestionType extends AbstractType{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('libelle');
$builder->add('description');
$builder->add('imageRoot');
$builder->add('page', 'integer', array('required' => false));
$builder->add('ligne', 'integer', array('required' => false));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => 'AppBundle\Entity\Question',
'csrf_protection' => false
]);
}
}
其次,我在 validation.yml 文件中配置了验证参数:
AppBundle\Entity\Question:
properties:
libelle:
- NotBlank: ~
- Type: string
description:
- NotBlank: ~
- Type: string
imageRoot:
- Type: string
page:
- Type: integer
- GreaterThan:
value: 0
- LessThanOrEqual:
value: 1000
ligne:
- Type: integer
- GreaterThan:
value: 0
- LessThanOrEqual:
value: 1000
第三,我在控制器中创建了表单
class ContenuController extends Controller{
/**
* @Rest\View(serializerGroups={"contenu"}, statusCode=Response::HTTP_CREATED)
* @Rest\Post("/lectureContenu/{id}/Questions")
*/
public function postQuestionAction(Request $request)
{
$em = $this->getDoctrine()->getEntityManager();
$contenu = $em->getRepository('AppBundle:Contenu')->find($request->get('id'));
$typeQuestion = $em->getRepository('AppBundle:TypeQuestion')->find(1);
if (empty($contenu)) {
return new JsonResponse(['message' => 'Contenu de la question inexistant'], Response::HTTP_NOT_FOUND);
}
$question = new Question();
$question->setContenu($contenu)
->setTypeQuestion($typeQuestion);
$form = $this->createForm(QuestionType::class, $question);
$form->submit($request->request->all()); // Validation des données
if ($form->isValid()) {
$em->persist($question);
$em->flush();
return $question;
} else {
return $form;
}
}
}
最后,当我 运行 我的代码使用下面的示例(使用 Postman)时:
{
"libelle": "test",
"description": "test",
"imageRoot": "test"
}
我收到这个错误:
...
"message": "Could not load type \"integer\"",
"class": "Symfony\Component\Form\Exception\InvalidArgumentException",
...
我不知道为什么!对我来说,一切似乎都是正确的。请帮忙!
我把我的评论作为答案从未回答的问题中删除这个问题。
类型名称在 Symfony 2.8 中弃用,在 Symfony 3 中删除。
将子项添加到表单类型时,必须使用该类型的完全限定名称 (FQN)。
您可以通过两种方式完成(以您的 Integer 类型为例)
$builder->add('page', IntegerType::class)
或
$builder->add('page', 'Symfony\Component\Form\Extension\Core\Type\IntegerType');
如果您使用第一个选项,请不要忘记在您的 class 定义中导入 class:
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
此处提供所有类型的列表:https://symfony.com/doc/current/reference/forms/types.html
我正在使用 FosrestBundle 和 Symfony3 构建一个 API。在我工作的某些部分,我必须构建表单,并且我希望我的表单的某些字段设置为 "not required"。但是当我尝试创建它们时出现错误。
以下是我如何为我的实体之一创建表单:"Question"。
首先,我创建了一个 QuestionType class,我将 required 设置为 false:
class QuestionType extends AbstractType{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('libelle');
$builder->add('description');
$builder->add('imageRoot');
$builder->add('page', 'integer', array('required' => false));
$builder->add('ligne', 'integer', array('required' => false));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => 'AppBundle\Entity\Question',
'csrf_protection' => false
]);
}
}
其次,我在 validation.yml 文件中配置了验证参数:
AppBundle\Entity\Question:
properties:
libelle:
- NotBlank: ~
- Type: string
description:
- NotBlank: ~
- Type: string
imageRoot:
- Type: string
page:
- Type: integer
- GreaterThan:
value: 0
- LessThanOrEqual:
value: 1000
ligne:
- Type: integer
- GreaterThan:
value: 0
- LessThanOrEqual:
value: 1000
第三,我在控制器中创建了表单
class ContenuController extends Controller{
/**
* @Rest\View(serializerGroups={"contenu"}, statusCode=Response::HTTP_CREATED)
* @Rest\Post("/lectureContenu/{id}/Questions")
*/
public function postQuestionAction(Request $request)
{
$em = $this->getDoctrine()->getEntityManager();
$contenu = $em->getRepository('AppBundle:Contenu')->find($request->get('id'));
$typeQuestion = $em->getRepository('AppBundle:TypeQuestion')->find(1);
if (empty($contenu)) {
return new JsonResponse(['message' => 'Contenu de la question inexistant'], Response::HTTP_NOT_FOUND);
}
$question = new Question();
$question->setContenu($contenu)
->setTypeQuestion($typeQuestion);
$form = $this->createForm(QuestionType::class, $question);
$form->submit($request->request->all()); // Validation des données
if ($form->isValid()) {
$em->persist($question);
$em->flush();
return $question;
} else {
return $form;
}
}
}
最后,当我 运行 我的代码使用下面的示例(使用 Postman)时:
{
"libelle": "test",
"description": "test",
"imageRoot": "test"
}
我收到这个错误:
...
"message": "Could not load type \"integer\"",
"class": "Symfony\Component\Form\Exception\InvalidArgumentException",
...
我不知道为什么!对我来说,一切似乎都是正确的。请帮忙!
我把我的评论作为答案从未回答的问题中删除这个问题。
类型名称在 Symfony 2.8 中弃用,在 Symfony 3 中删除。
将子项添加到表单类型时,必须使用该类型的完全限定名称 (FQN)。 您可以通过两种方式完成(以您的 Integer 类型为例)
$builder->add('page', IntegerType::class)
或
$builder->add('page', 'Symfony\Component\Form\Extension\Core\Type\IntegerType');
如果您使用第一个选项,请不要忘记在您的 class 定义中导入 class:
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
此处提供所有类型的列表:https://symfony.com/doc/current/reference/forms/types.html