2016-09-23 79 views
0

我正在使用REST Web服务(FOSRestBundle 2.0.0,Symfony 3.1.3)并测试实体的创建。创建本身对一组正确的数据工作正常,但如果我尝试省略所需的值,控制器仍然表示该表单是有效的。在Symfony 3上使用FosRestBundle进行表单验证问题

实体本身:

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”字段,我相信我应该得到一个无效的表单错误,但我没有得到它。

我试着用

$form->submit([]) 

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

改变 “的handleRequest” 无济于事。如果我向实体本身添加“NotBlank()”约束条件,但我的印象是这是一种解决方法,而不是解决方法。我错过了什么 ?

回答

0
$form->isValid() 

这条线将验证您提交的数据尊重所有写在你的实体文件的限制(以断言注释,例如@assert \ NotBlank())。

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

+0

的确如我所说的这种处理约束的特殊方式起作用,但是如何使用这种形式不会产生类似的结果?由于表单“知道”哪些字段是必需的/整数/其他,为什么“isValid()”调用不使用这个?按照设计,我身边的错误? – NaeiKinDus