Я очень новичок в Symfony и имею проблемы с внедрением RESTful API, в частности формы, для которой входящий JSON не включает в себя все параметры.Symfony 2.8 form заставляет отсутствующие логические значения false
До сих пор я настраивал контроллер, обрабатывающий запрос POST. Приложение POST представляет собой JSON, содержащий либо поля isPaired
, и/или поля isTutorialSeen
.
- Случай 1 (рабочее место):
Когда запрос POST содержит {"isTutorialSeen":true, "isPaired": true}
, то оба поля установлены верно, когда я пытаюсь $form->get('isPaired')->getData()
или $form->get('isTutorialSeen')->getData()
. Это то, чего я ожидаю.
- Случай 2 (не работает случай):
Когда запрос POST содержит {"isTutorialSeen":true}
, то я могу видеть, что isPaired поле формы устанавливается в ложь, когда я пытаюсь $form->get('isPaired')->getData()
. Вероятно, потому что поле не было передано в JSON. Не передавать его в JSON должно иметь значение «не обновлять его», а не «устанавливать значение false». То же, что и грамматика HTTP «PATCH».
Я почесываю волосы, пытаясь понять, как я могу получить «нуль», например, вместо «ложного» возврата здесь.
Мой контроллер реализован следующим образом:
/**
* @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;
Может быть варианты = {» по умолчанию "= FALSE} в конфигурации сущности отвечает за это, но хотя это делает sen se в слое persistence, чтобы иметь значение false в качестве значения по умолчанию, поскольку принудительное значение false в слое, ответственном за отображение данных формы (или отсутствующих данных), не является тем, что мне нужно. Любая помощь будет оценена!
В случае 2, вы делаете обновление вашей организации? –
@ MatkoĐipalo Да, в случае 2, я обновляю объект, если поля не равны нулю. Как вы можете видеть, поля всегда не равны нулю, даже если они не указаны в запросе. – SCO