使用FosrestBundle构建表单时,在Symfony3中使用“not required”

时间:2016-11-19 12:22:59

标签: forms doctrine-orm symfony fosrestbundle

我正在使用FosrestBundle和Symfony3构建API。在我工作的某些部分,我要构建表单,并且我希望我的表单中的某些字段设置为“不需要”。但是当我尝试创建它时我遇到了错误。

以下是我为我的某个实体创建表单的方法:“问题”。

首先我创建了一个QuestionType类,我将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",
...

我不知道为什么!对我来说,一切似乎都是正确的请帮忙!

1 个答案:

答案 0 :(得分:1)

我把我的评论作为一个答案,从未答复的问题中删除这个问题。

Symfony 2.8中的类型名称已弃用,Symfony 3中的已删除

将child添加到表单类型时,必须使用该类型的完全限定名称(FQN)。 您可以通过两种方式完成此操作(例如,使用Integer类型)

$builder->add('page', IntegerType::class)

$builder->add('page', 'Symfony\Component\Form\Extension\Core\Type\IntegerType');

如果您使用第一个选项,请不要忘记在类定义中导入该类:

use Symfony\Component\Form\Extension\Core\Type\IntegerType;

所有类型的列表均可在此处获取:https://symfony.com/doc/current/reference/forms/types.html