如何将数据插入 mysql 从 Angular 5 表单通过 API 发送到 Symfony?

How to insert data into mysql sent from Angular 5 form to Symfony through API?

Post 回应

form.components.ts

OnSubmit(form : NgForm){

    this.userService.addUser(form.value).subscribe((data : any)=> {

        if(data.Succeeded ==true){
            console.log("Sent");
        }
    });
}   

user.service

addUser(user: User){
    const body: User = {
        UserName: user.UserName,
        Password: user.Password,
        Email: user.Email,
        FirstName: user.FirstName,
        LastName: user.LastName
    }

    return this.http.post(this.url , body);
}

我是 angular 和 Symfony 的新手。我还没有看到太多关于如何执行上述操作的教程。在上面的代码中,我通过 API 将数据从 Angular 发送到 symfony 5. 我的问题是如何从 api 获取所有数据并插入 mysql.

在 Symfony 中有很多方法可以实现这一点。我将假设您使用带有 Doctrine 作为 ORM 的基本 Symfony 堆栈,您的实体已经创建,并且您已经有一个带有 Request 参数的控制器。

优化方式

您首先需要使用 Serializer service 反序列化响应。如果响应有效,您将获得一个填充有您的请求数据的用户实体对象。

然后,使用实体管理器将persist数据输入到您的数据库中。

您还可以使用一些 validation 在持久化之前验证数据,并在需要时使用 return 错误。

使用自动装配和自动配置,您所有的控制器都将注册为服务,并且您的所有依赖项都将被注入。所以你可以这样做:

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 :

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 **/
      }
}

"easy"方式

您也可以使用forms。创建一个与您的用户实体相对应的表单。

像这样的东西应该可以解决问题。但是,请注意字段的名称。如果您的 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 对象将以 "easy" 方式创建并且有点大。但是,对于新手来说,使用和理解起来就困难多了。

使用你觉得舒服的那个。