如何将数据插入 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" 方式创建并且有点大。但是,对于新手来说,使用和理解起来就困难多了。
使用你觉得舒服的那个。
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" 方式创建并且有点大。但是,对于新手来说,使用和理解起来就困难多了。
使用你觉得舒服的那个。