私は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にすることは、私が必要とするものではありません。 ご協力いただければ幸いです!エンティティの
は、あなたがあなたのエンティティの更新をしているの? –
@MatkoĐipaloはい、ケース2の場合、フィールドがnullでない場合、エンティティを更新します。あなたが見ることができるように、フィールドは要求には含まれていませんが、常にnullではありません。 – SCO