我在Symfony2中使用FMSRestBundle使用JMSSerializerBundle爲實體序列化原型開發了一個REST API。通過GET請求,我可以使用SensioFrameworkExtraBundle的ParamConverter功能根據id請求參數獲取實體的實例,並在使用POST請求創建新實體時,我可以使用FOSRestBundle body轉換器基於實體創建實體的新實例請求數據。但是當我想更新現有的實體時,使用FOSRestBundle轉換器會給出一個沒有id的實體(即使id與請求數據一起發送),所以如果我堅持它,它會創建一個新的實體。並且使用SensioFrameworkExtraBundle轉換器爲我提供沒有新數據的原始實體,因此我必須手動從請求中獲取數據並調用所有setter方法來更新實體數據。如何使用FOSRestBundle處理REST API中的實體更新(PUT請求)
所以我的問題是,什麼是處理這種情況的首選方式?感覺應該有一些方法來處理這個問題,使用請求數據的(反)序列化。我是否缺少與ParamConverter或JMS序列化程序相關的東西來處理這種情況?我意識到有很多方法可以做這種事情,而且沒有一種方法適合每種用例,只需要尋找一些適合這種快速原型的東西,通過使用ParamConverter和需要編寫的最小代碼即可完成在控制器/服務中。
下面是如上所述的與GET和POST操作的控制器的一個示例:
namespace My\ExampleBundle\Controller;
use My\ExampleBundle\Entity\Entity;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Validator\ConstraintViolationListInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\View\View;
class EntityController extends Controller
{
/**
* @Route("/{id}", requirements={"id" = "\d+"})
* @ParamConverter("entity", class="MyExampleBundle:Entity")
* @Method("GET")
* @Rest\View()
*/
public function getAction(Entity $entity)
{
return $entity;
}
/**
* @Route("/")
* @ParamConverter("entity", converter="fos_rest.request_body")
* @Method("POST")
* @Rest\View(statusCode=201)
*/
public function createAction(Entity $entity, ConstraintViolationListInterface $validationErrors)
{
// Handle validation errors
if (count($validationErrors) > 0) {
return View::create(
['errors' => $validationErrors],
Response::HTTP_BAD_REQUEST
);
}
return $this->get('my.entity.repository')->save($entity);
}
}
而在config.yml我爲FOSRestBundle以下配置:
fos_rest:
param_fetcher_listener: true
body_converter:
enabled: true
validate: true
body_listener:
decoders:
json: fos_rest.decoder.jsontoform
format_listener:
rules:
- { path: ^/api/, priorities: ['json'], prefer_extension: false }
- { path: ^/, priorities: ['html'], prefer_extension: false }
view:
view_response_listener: force
而不僅僅是共享一個鏈接,說明這部分與該鏈接的代碼將有助於OP 。 – GusDeCooL