Symfony FOSRestBundle POST 请求 500 错误
Symfony FOSRestBundle POST request 500 error
我正在尝试使用 FOSRestBundle 创建一个实体。
URL:
POST http://localhost:8000/app_dev.php/api/links
请求负载:
{"link":{"id":"5","title":"foo","description":"foo","url":"foo","image":null,"issue":"1","creator":"1"}
}
这是控制器(已生成):
/**
* Create a Link entity.
*
* @View(statusCode=201, serializerEnableMaxDepthChecks=true)
*
* @param Request $request
*
* @return Response
*
*/
public function postAction(Request $request)
{
$entity = new Link();
$form = $this->createForm(new LinkType(), $entity, array("method" => $request->getMethod()));
$this->removeExtraFields($request, $form);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return $entity;
}
return FOSView::create(array('errors' => $form->getErrors()), Codes::HTTP_INTERNAL_SERVER_ERROR);
}
我收到这个 500 错误,这真的没有帮助:
{"formErrorIterators":{"errors":{"form":{"children":{"title":[],"type":[],"summary":[],"description":[],"url":[],"image":[],"date":{"children":{"date":{"children":{"year":[],"month":[],"day":[]}},"time":{"children":{"hour":[],"minute":[]}}}},"creator":[],"issue":[]}},"errors":[]}}}
我认为 $Request 没有正确发送或接收,因为在某些时候我取消了 csrf 保护,而 Doctrine 想要创建一个只有空字段的实体。
这是我的 config.yml:
fos_rest:
routing_loader:
default_format: json
param_fetcher_listener: true
body_listener:
array_normalizer: fos_rest.normalizer.camel_keys
body_converter:
enabled: true
format_listener:
rules:
- { priorities: ['json'], fallback_format: json, prefer_extension: false }
view:
view_response_listener: force
有什么想法吗?
谢谢
好的,原来有几个错误:
首先,JSON 负载格式错误:
{"title":"foo","summary":null,"description":"foo","url":"foo","image":null,"issue":"1","creator":"1"}
(我去掉了节点的名字)
然后,类型描述符不正确:
$builder
->add('title', 'text')
->add('type', 'text')
->add('summary', 'text')
->add('description', 'text')
->add('url', 'text')
->add('image', 'text')
->add('date', 'date')
->add('creator', 'entity', array(
'class' => 'AppBundle:User')
)
->add('issue', 'entity', array(
'class' => 'AppBundle:Issue')
)
;
我添加了类型和实体使其正常。
不过,我会更喜欢更精确的错误代码。
我正在尝试使用 FOSRestBundle 创建一个实体。
URL:
POST http://localhost:8000/app_dev.php/api/links
请求负载:
{"link":{"id":"5","title":"foo","description":"foo","url":"foo","image":null,"issue":"1","creator":"1"}
}
这是控制器(已生成):
/**
* Create a Link entity.
*
* @View(statusCode=201, serializerEnableMaxDepthChecks=true)
*
* @param Request $request
*
* @return Response
*
*/
public function postAction(Request $request)
{
$entity = new Link();
$form = $this->createForm(new LinkType(), $entity, array("method" => $request->getMethod()));
$this->removeExtraFields($request, $form);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return $entity;
}
return FOSView::create(array('errors' => $form->getErrors()), Codes::HTTP_INTERNAL_SERVER_ERROR);
}
我收到这个 500 错误,这真的没有帮助:
{"formErrorIterators":{"errors":{"form":{"children":{"title":[],"type":[],"summary":[],"description":[],"url":[],"image":[],"date":{"children":{"date":{"children":{"year":[],"month":[],"day":[]}},"time":{"children":{"hour":[],"minute":[]}}}},"creator":[],"issue":[]}},"errors":[]}}}
我认为 $Request 没有正确发送或接收,因为在某些时候我取消了 csrf 保护,而 Doctrine 想要创建一个只有空字段的实体。
这是我的 config.yml:
fos_rest:
routing_loader:
default_format: json
param_fetcher_listener: true
body_listener:
array_normalizer: fos_rest.normalizer.camel_keys
body_converter:
enabled: true
format_listener:
rules:
- { priorities: ['json'], fallback_format: json, prefer_extension: false }
view:
view_response_listener: force
有什么想法吗? 谢谢
好的,原来有几个错误:
首先,JSON 负载格式错误:
{"title":"foo","summary":null,"description":"foo","url":"foo","image":null,"issue":"1","creator":"1"}
(我去掉了节点的名字)
然后,类型描述符不正确:
$builder
->add('title', 'text')
->add('type', 'text')
->add('summary', 'text')
->add('description', 'text')
->add('url', 'text')
->add('image', 'text')
->add('date', 'date')
->add('creator', 'entity', array(
'class' => 'AppBundle:User')
)
->add('issue', 'entity', array(
'class' => 'AppBundle:Issue')
)
;
我添加了类型和实体使其正常。
不过,我会更喜欢更精确的错误代码。