在Symfony 3上使用FosRestBundle进行表单验证问题

时间:2016-09-23 12:26:55

标签: php symfony fosrestbundle

我正在开发一个REST Web服务(FOSRestBundle 2.0.0,Symfony 3.1.3)并测试实体的创建。创建本身可以正常使用一组正确的数据,但如果我尝试省略所需的值,控制器仍然会说该表单有效。

实体本身:

class Customer implements ExportableEntity
{
    use Traits\FilterableTrait;
    use Traits\UuidTrait;

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @Serializer\Exclude()
     * @Serializer\ReadOnly()
     */
    private $id;

    /**
     * @var int
     *
     * @ORM\Column(name="customer_index", type="integer", unique=true)
     */
     private $customerIndex;

    /**
     * @var string
     *
     * @ORM\Column(name="customerName", type="string", length=255)
     */
     private $customerName;
     // [... accessors ...]

控制器:

/**
 * @ApiDoc(
 *      resource=false,
 *      description="Create a new customer",
 *      section="Customers",
 *      statusCode={
 *          200="Action successful",
 *          403="Authorization required but incorrect / missing information or unsufficient rights",
 *          500="Returned if action failed for unknown reasons"
 *      }
 *  )
 *
 * @param Customer $customer
 * @return RestResponse
 */
public function postCustomerAction(Request $request) {
    $manager = $this->container->get('corebundle.managers.customer');
    // Internal usage only, no link with the WS issue
    $manager->setChecksEnabled(false);

    $customer = new Customer();
    $form = $this->get('form.factory')->createNamed(null, CustomerType::class, $customer, ['csrf_protection' => false]);
    $form->handleRequest($request);

    //if ($form->isValid()) {
    if ($form->isSubmitted() && $form->isValid()) {
        print('VALID');
        exit();
        $manager->create($customer);

        // Return 201 + Location
    }

    return \FOS\RestBundle\View\View::create($form, 400);
}

FormType:

class CustomerType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array                $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('customerName', Type\TextType::class, array('label' => 'Customer name'))
            ->add('customerIndex', Type\IntegerType::class, array('label' => 'Customer Index'))
            ->add('comment', Type\TextareaType::class, array('label' => 'Comments',
                                                             'required' => false, ))
            ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array('data_class' => 'NetDev\CoreBundle\Entity\Customer'));
    }

    /**
     * @return string
     */
    public function getBlockPrefix()
    {
        return 'netdev_corebundle_customer';
    }
}

如果我尝试创建新客户并省略" customerIndex"我相信我应该得到一个无效的表单错误,但是我没有得到它。

我试图改变" handleRequest"与

$form->submit([])

$form->submit($request->request->get($form->getName()))

无济于事。如果我添加" NotBlank()"它对实体本身有约束作用,但我认为这将是一种解决方法,而不是修复。我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

$form->isValid()

此行将验证您提交的数据是否符合实体文件中写入的所有约束(使用Assert注释,例如@Assert \ NotBlank())。

所以,你没有错过任何东西。