我正在使用Symfony 3.4和FOSRestBundle作为我的API。
所有服务都正常工作,除了我发布一个带有表单和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对象作为请求主体发送而不是普通的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有效负载 - 解码器将失败。
只需添加第一个答案,您还需要修改JSON有效负载。
您必须直接输入您的mobile_app_user ID:
{
"assistance_call": {
"mobile_app_user": 1
}
}