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

时间:2018-02-16 07:36:53

标签: angular symfony symfony-3.4

回复后

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 and Symfony的新手。我还没有看到很多关于如何进行上述操作的教程。在上面的代码中,我通过API将数据发送到Angular 5的symfony。我的问题是如何从api获取所有数据并插入到mysql中。

1 个答案:

答案 0 :(得分:1)

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

优化方式

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

然后,使用实体管理器将persist数据导入数据库。

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

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

#Determine the last empty row - brute force.
For ($i = $outputWorksheet.UsedRange.Rows.Count; $i -gt 1; $i--) {
   if (!$Excel.WorksheetFunction.CountA($outputWorksheet.Range("$($i):$($i)")) -eq 0) {
       $lastRow = "A$($i + 1)"
       Break;
   }
}

如果没有自动装配和自动配置,您只需使用Controller类的get()函数和getDoctrine()快捷方式:

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

" easy"方式

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

这样的事情应该可以解决问题。但是,请注意字段的名称。如果您的API字段名称与您的实体字段名称不对应,则可能需要使用property-path选项。

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

然后,在您的控制器中,提交它并保留您的数据:

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,
        ]);
    }
}

正如我所说,第一种方式更加优化,因为Form对象将在" easy"中创建。方式,有点大。但是,当你是新来者时,使用和理解它会更加困难。

使用您认为合适的人。