Symfony 中有很多方法可以实现这一点。我将假设你使用了一个基本的 Symfony 堆栈,其中Doctrine作为 ORM,你的实体已经创建,并且你已经有一个具有 Request 参数的控制器。
优化的方式
您首先需要使用Serializer 服务对 Response 进行反序列化。如果响应有效,您将获得一个填充了您的请求数据的用户实体对象。
然后,使用实体管理器将数据持久保存到您的数据库中。
您还可以在持久化之前使用一些验证来验证数据,并在需要时返回错误。
使用自动装配和自动配置,您的所有控制器都将注册为服务,并且您的所有依赖项都将被注入。所以你可以这样做:
class AcmeController extends Controller
{
private $serializer;
private $entityManager;
public function __construct(Serializer $serializer, EntityManager $entityManager) {
$this->serializer = $serializer;
$this->entityManager = $entityManager;
}
public function myAction(Request $request) {
$user = $this->serializer->deserialize($request->request->all(), User::class, 'json');
/** validate your data, the $user will be false if the serializer encountered an error **/
$this->entityManager->persist($user);
$this->entityManager->flush();
/** Return whatever Response object you need **/
}
}
如果没有自动装配和自动配置,您可以只使用控制器类的 get() 函数和 getDoctrine() 快捷方式:
class AcmeController extends Controller
{
public function myAction(Request $request) {
$user = $this->get('serializer')->deserialize($request->request->all(), User::class, 'json');
/** validate your data first, the $user will be false if the serializer encountered an error **/
$this->getDoctrine()->getManager()->persist($user);
$this->getDoctrine()->getManager()->flush();
/** Return whatever Response object you need **/
}
}
“简单”的方法
您也可以使用表格。创建一个与您的用户实体相对应的表单。
像这样的东西应该可以解决问题。但是,请注意字段的名称。如果您的 API 字段名称与您的实体字段名称不对应,您可能需要使用property-path选项。
class UserForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('LastName')
->add('FirstName')
->add('password', PasswordType::class)
->add('Email', EmailType::class)
->add('UserName')
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
]);
}
}
然后,在您的控制器中,提交并保存您的数据:
class AcmeController extends Controller
{
public function myAction(Request $request) {
$user = new User();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->getDoctrine()->getManager()->persist($user);
$this->getDoctrine()->getManager()->flush();
/** Return whatever Response object you need **/
}
// get errors
$errors = $form->getErrors();
/** Return whatever Response object you need **/
}
}
正如我所说,第一种方式更加优化,因为 Form 对象将以“简单”的方式创建并且有点大。但是,当您是新手时,使用和理解它要困难得多。
使用你觉得舒服的那个。