我使用param转换器从url和body转换器获取对象以获取对象形式的主体。
这完全适用于GET
和POST
方法,但我必须采用一种棘手的方式进行更新(PUT
):
/**
* @param PowerDNSDomain $domain
* @param PowerDNSRecord $record
* @param PowerDNSRecord $updatedRecord
* @param ConstraintViolationListInterface $validationErrors
*
* @ParamConverter("updatedRecordData", converter="fos_rest.request_body")
*
* @return View
*/
public function putAction(PowerDNSDomain $domain, PowerDNSRecord $record, PowerDNSRecord $updatedRecord, ConstraintViolationListInterface $validationErrors)
{
if ($validationErrors->count() > 0) {
return $this->handleBodyValidationErrorsView($validationErrors);
}
$record->setName($updatedRecord->getName().'.'.$domain->getName())
->setContent($updatedRecord->getContent())
->setTtl($updatedRecord->getTtl())
->setPrio($updatedRecord->getPrio());
$this->get('manager.dns')->saveRecord($record);
return $this->view($record);
}
简而言之,我必须检索两个PowerDNSDomain
对象(一个来自网址,一个来自正文)并手动更新每个字段。
这太过分了,不是吗?
首选方法是拥有这样的方法签名:
public function putAction(PowerDNSDomain $domain, ConstraintViolationListInterface $validationErrors)
PowerDNSDomain $domain
是将身体转换器对象合并到param转换器中的结果。
在这种情况下,我只需要获得验证错误并保存对象。
我怎样才能做到这一点? : - )
相关配置:
fos_rest:
routing_loader:
default_format: json
body_converter:
enabled: true
validate: true
serializer:
serialize_null: true
view:
formats:
xml: false
json: true
rss: false
yml: true
view_response_listener: force
param_fetcher_listener: force
format_listener:
rules:
- { path: '^/api/', priorities: ['json', 'yml'], fallback_format: json, prefer_extension: true }
- { path: '^/', stop: true } # FOSRest should not handle other routes than API
media_type:
enabled: true
可能相关的问题:https://github.com/FriendsOfSymfony/FOSRestBundle/issues/1238