私は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()」制約を追加すると機能しますが、これは修正ではなく回避策になるという印象を受けています。私は何か見落としてますか ?
確かに私は制約を扱うこの特定の方法については言いましたが、フォームを使用しても同様の結果は得られませんでしたか?フォームはどのフィールドが必須か/整数/何であるかを "知っている"ので、 "isValid()"呼び出しでこれを使用できないのはなぜですか?設計上、私の側で間違い? – NaeiKinDus