我创建了一个使用Symfony 4
jms_serializer
和annotations
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项目。
在这里使用它会有意义吗?
答案 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)
;
}
}