Symfony 4 api - 如何更新实体

时间:2018-04-20 23:41:41

标签: json rest api symfony

我创建了一个使用Symfony 4 jms_serializerannotations

fos_rest_bundle项目

我想知道如何更新现有实体。

我有以下内容:

class ProgramController extends FOSRestController {

 /**
  * @FOSRest\Put("/programs/{id}")
  * @ParamConverter("updatedProgram", converter="fos_rest.request_body")
  */
  public function putProgram(Program $program, Program $updatedProgram) 
  {
     //missing logic here
  }
}

使用ParamConverters我有2 Program Entity Objects
$program - 从数据库填充 $updatedProgram - 从提交的json数据

中填充

Program Entities与其他Entities有多种关系。

更新程序的最佳方法是什么?

我只是用$program覆盖$updatedProgram吗? (这将假设所有现有$program数据都是$updatedProgram的一部分,而不仅仅是更新。

我是否需要手动将所有$program->property值设置为等于$updatedProgram值?

我过去曾使用FormType作为非api symfony项目。 在这里使用它会有意义吗?

1 个答案:

答案 0 :(得分:0)

基本上你可以

1)将EntityManagerInterface注入此控制器或其他保存逻辑并仅从控制器调用的服务。在那里你可以通过逐个设置属性来更新对象。

2)Symfony Form Builder

public function updatePartsAction(Request $request, $subid) {
    $r = $this->getDoctrine()->getManager();

$entity = $r->getRepository('MainBundle:MainSub')->findOneById($subid);

if (!$entity) {
    throw $this->createNotFoundException('Unable to find Parts entity to edit.');
}
$form= $this->createFormBuilder($entity)
       ->add('part')
       ->add('batch')
       .... and so on the properties from your entity that you want them to edit
       ->getForm();
 if ($this->getRequest()->getMethod() == "POST") { // better to use isSubmitted() && isValid imo
        $form->handleRequest($request)
        if ($form->isValid()) {
        $r->persist($form->getData());
        $r->flush();
        }
  }
}

3)使用SonataAdminBundle - 创建表单和列表。 (快速简便地修改数据)

<?php


use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Form\Type\ModelType;

class PageAdmin extends AbstractAdmin
{
    protected function configureFormFields(FormMapper $formMapper)
    {
        $imageFieldOptions = []; // see available options below

        $formMapper
            ->add('image1', ModelType::class, $imageFieldOptions)
        ;
    }
}