2017-01-19 17 views
0

Я очень новичок в 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 в слое, ответственном за отображение данных формы (или отсутствующих данных), не является тем, что мне нужно. Любая помощь будет оценена!

+0

В случае 2, вы делаете обновление вашей организации? –

+0

@ MatkoĐipalo Да, в случае 2, я обновляю объект, если поля не равны нулю. Как вы можете видеть, поля всегда не равны нулю, даже если они не указаны в запросе. – SCO

ответ

0

По умолчанию значение поля для объекта устанавливается следующим образом:

protected $isTutorialSeen = null; 

, но я не уверен, если это поможет в этом случае.

+0

Пробовал, но это не помогло. – SCO

0

Когда вы собираетесь создать совершенно новый ресурс, вы используете метод POST. По дизайну метод запроса POST запрашивает, чтобы веб-сервер принимал и сохранял данные, заключенные в тело сообщения запроса.

Если вы решили обновить свой ресурс, вы должны создать запрос PUT или PATCH. PATCH в основном похож на PUT, за исключением того, что вам не нужно отправлять весь ресурс.

Итак, первое, что вам нужно изменить - использовать PUT (или PATCH) для обновления.

Если вы собираетесь использовать PUT, вы должны отправить полное представление ресурса. Если вы не отправляете isPaired, сервер должен аннулировать его - в вашем случае сервер установит его значение по умолчанию.

Если вы собираетесь использовать PATCH, вы можете опустить isPaierd, и он не будет изменен, но вы должны найти код, который отправляет форму и добавляет второй параметр со значением true.

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

Symfony \ Component \ Form | FormInterface:

/** 
* 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