簡體   English   中英

FOSRestBundle EntityType在JSON中不起作用

[英]FOSRestBundle EntityType not working in JSON

我正在為我的API使用Symfony 3.4和FOSRestBundle。
除此服務之外,所有服務均正常運行,在該服務中,我要發布具有表單和EntityType字段的實體。

控制器:

public function createAssistanceCallAction(Request $request)
{
    $assistanceCall = new AssistanceCall();
    $form = $this->createForm(AssistanceCallType::class, $assistanceCall);

    $form->handleRequest($request);
    dump($form->isSubmitted(), $form->isValid());die;
}

實體屬性:

/**
 * @var MobileAppUser
 *
 * @ORM\ManyToOne(targetEntity="MobileAppUser")
 * @ORM\JoinColumn(name="mobile_app_user_id", referencedColumnName="id", nullable=false)
 * @Assert\NotBlank
 */
protected $mobileAppUser;

形成:

/**
 * {@inheritdoc}
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('mobile_app_user', EntityType::class, array(
            'class' => 'AppBundle:MobileAppUser',
        ))
        ->add('save', SubmitType::class)
    ;
}

使用普通的POST可以正常工作:

curl -X POST http://mysite.local/api/users/1/create-assistance-call -F 'assistance_call[mobile_app_user]=26'

dump($form->isSubmitted(), $form->isValid());die; // true and true

不適用於JSON格式:

curl -X POST \
  http://mysite.local/api/users/1/create-assistance-call \
  -d '{
    "assistance_call": {
        "mobile_app_user": {
            "id": 1
        }
    }
}'

dump($form->isSubmitted(), $form->isValid());die; // false and false

我在JSON示例中做錯了什么?

只需添加到第一個答案,您還需要修改JSON有效負載。

您必須直接輸入您的mobile_app_user ID:

{
    "assistance_call": {
        "mobile_app_user": 1
    }
}

由於您將json對象作為請求正文而不是作為普通的POST字段發送-您應該json_decode請求內容,然后使用$form->submit(...)將數據加載到表單中。 舊的好handleRequest()在這里不會執行。 看下面的例子:

public function createAssistanceCallAction(Request $request)
{
    $assistanceCall = new AssistanceCall();
    $form = $this->createForm(AssistanceCallType::class, $assistanceCall);

    //Notice the "true" argument passed to the json_decode
    $data = json_decode($request->getContent(), true);
    $form->submit($data);

    dump($form->isSubmitted(), $form->isValid());die;
}

您還可以使用FOSRestBundle BodyListener為您解碼json。 為此,請添加以下配置條目:

fos_rest:
    body_listener:
      decoders:
          json: fos_rest.decoder.jsontoform

這仍然不是$form->handleRequest()一個好選擇,因為它只允許每個表單使用一個方法,因此,如果將表單配置為執行POST-PUT請求將始終失敗,而不會出現任何顯式錯誤消息。

因此,您可以像這樣修改上面的代碼:

public function createAssistanceCallAction(Request $request)
{

    $assistanceCall = new AssistanceCall();
    $form = $this->createForm(AssistanceCallType::class, $assistanceCall);
    $form->submit($request->request->all());

    dump($form->isSubmitted(), $form->isValid());die;
}

請注意您發送的Content-Type標頭,就像將其設置為'multipart / form-data'一樣,同時在其主體中包含JSON有效負載-解碼器將失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM