2017-01-19 4 views
0

私はSymfonyを初めて使い、特に着信JSONにすべてのパラメータが含まれていないフォームのRESTful APIを実装する際に問題があります。Symfony 2.8フォームはブール値をfalseに強制しません

これまでのところ、POSTリクエストを処理するコントローラをセットアップしました。このアプリケーションは、isPairedおよび/またはisTutorialSeenのフィールドを含むJSONをPOSTします。

  • ケース1(作業の場合):

POSTのクエリが{"isTutorialSeen":true, "isPaired": true}が含まれている場合、私は$form->get('isPaired')->getData()または$form->get('isTutorialSeen')->getData()をしようとすると、その後、両方のフィールドがtrueに設定されています。これは私が期待するものです。

  • ケース2(動作していない場合):

POSTのクエリが{"isTutorialSeen":true}が含まれている場合は、その後、私は$form->get('isPaired')->getData()をしようとすると、フォームのisPairedフィールドがfalseに設定されていることがわかります。おそらくフィールドがJSONで渡されなかったためです。 JSONを渡さないと、「更新しないでください」という意味があり、「falseに設定してはいけません」という意味になります。 HTTP 'PATCH'文法と同じです。

私はここで「偽」の代わりに「null」を得る方法を見つけようとしています。次のように

マイコントローラが実装されている:

/** 
    * @Rest\Post("/installation/state") 
    * 
*/ 
public function installationStateAction(Request $request, Subscription $subscription) 
{ 
    $view = null; 

    $form = $this->createForm(InstallationStateType::class); 
    ControllerUtils::handleForm($request, $form); 

    if ($form->isValid()) { 
     $isPaired = $form->get('isPaired')->getData(); 
     $isTutorialSeen = $form->get('isTutorialSeen')->getData(); 

     if ($isPaired !== null) 
      $subscription->setIsPaired($isPaired); 

     if ($isTutorialSeen !== null) 
      $subscription->setIsTutorialSeen($isTutorialSeen); 

     $this->getDoctrine()->getManager()->flush($subscription); 
    } 

    $view = $this->view($subscription, Codes::HTTP_OK); 
    return $this->handleView($view); 
} 

次のようにInstallationStateTypeである:

/** 
* Form for InstallationState. 
*/ 
class InstallationStateType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('isTutorialSeen', CheckboxType::class, ['required' => false]); 
     $builder->add('isPaired', CheckboxType::class, ['required' => false]); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $defaultsOptions = [ 
      'data_class' => null 
     ]; 

     $resolver->setDefaults($defaultsOptions); 
    } 

    public function getName() 
    { 
     return 'installationstate'; 
    } 
} 

サブスクリプションエンティティフィールドは次のとおり

/** 
* @ORM\Column(type="boolean", name="is_paired", options={"default"=FALSE}) 
* 
* @JSON\Expose 
* @JSON\Groups({"api_process"}) 
* @JSON\Since("1.0") 
* @JSON\SerializedName("isPaired") 
* 
* @var boolean 
*/ 
protected $isPaired; 

/** 
* @ORM\Column(type="boolean", name="is_tutorial_seen", options={"default"=FALSE}) 
* 
* @JSON\Expose 
* @JSON\Groups({"api_process"}) 
* @JSON\Since("1.0") 
* @JSON\SerializedName("isTutorialSeen") 
* 
* @var boolean 
*/ 
protected $isTutorialSeen; 

多分オプション= {」エンティティ構成の "default" = FALSE}はこれを担当しますが、sen永続化レイヤーでデフォルト値としてfalseを持つようにし、フォームデータ(または不在データ)をオブジェクトにマッピングする責任を負うレイヤーで強制的にfalseにすることは、私が必要とするものではありません。 ご協力いただければ幸いです!エンティティの

+0

は、あなたがあなたのエンティティの更新をしているの? –

+0

@MatkoĐipaloはい、ケース2の場合、フィールドがnullでない場合、エンティティを更新します。あなたが見ることができるように、フィールドは要求には含まれていませんが、常にnullではありません。 – SCO

答えて

0

デフォルトのフィールド値は次のように設定されている:

protected $isTutorialSeen = null; 

私はそれがそのような場合に役立つかどうかわからないです。

+0

それを試しましたが、それは助けになりませんでした。 – SCO

0

完全に新しいリソースを作成する場合は、POSTメソッドを使用します。設計上、POST要求メソッドは、Webサーバーが要求メッセージの本文に囲まれたデータを受け入れて格納することを要求します。

リソースを更新することを決定した場合は、PUTまたはPATCHリクエストを作成する必要があります。 PATCHはPUTとほとんど同じですが、リソース本体全体を送信する必要はありません。

まず、変更する必要があるのは、更新にPUT(またはPATCH)を使用することです。

PUTを使用する場合は、リソースの表現全体を送信する必要があります。 isPairedを送信しない場合、サーバーはそれを無効にする必要があります。サーバーでは、デフォルト値に設定されます。

PATCHを使用する場合は、isPaierdを省略できますが、変更されませんが、フォームを送信するコードを見つけて、2番目のパラメータを値trueで追加する必要があります。

$form->submit($data, true); 

のSymfony \コンポーネント\フォーム| FormInterface:ケース2では

/** 
* Submits data to the form, transforms and validates it. 
* 
* @param null|string|array $submittedData The submitted data 
* @param bool    $clearMissing Whether to set fields to NULL 
*           when they are missing in the 
*           submitted data. 
* 
* @return FormInterface The form instance 
* 
* @throws Exception\AlreadySubmittedException If the form has already been submitted. 
*/ 
public function submit($submittedData, $clearMissing = true); 
+0

動詞をPOSTからPATCHに変更することはできないので、PUTを使ってみました。 ControllerUtils :: handleForm($ request、$ form)を$ form-> submit($ request-> request-> all()、true)に置き換えました。行動は変わらなかった。 $ form-> get( 'isPaired') - > getData()戻り値は無効でない場合と同様にfalseです。 – SCO

関連する問題