[英]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.