React.js 可以使用 Symfony 表单组件吗?
Is it possible to use the Symfony form component with React.js?
我正在使用 Symfony 表单组件。我的项目中有很多表格。
要完美地学习表单组件还有很长的路要走,但现在我爱上了它。我也喜欢自动验证等等。
所以。现在我想在我的项目中学习和使用 React.js。
但似乎我无法像以前那样为项目使用验证和表单生成器?我在吗?
可能不是,因为您的表单是供服务器使用的:validation/show errors/data normalization/sanatization/etc.
通常您使用 React 来显示 HTML 并使用 API.
将其连接到您的服务器
虽然在 API 上下文中,您不会使用表单组件以 HTML 格式($form->createView()
方法)实际呈现您的表单,但您仍然可以从它提供的所有魔法:验证、表单事件等。API 与否,我个人认为您应该始终在控制器突变中使用表单类型。
例如,使用 FOSRestBundle,考虑一些如下所示的简单控制器操作:
/**
* @Rest\Put("posts/edit/{id}", name="posts.edit", requirements={"id"="\d+"})
*
* @param Post $post
* @param Request $request
*
* @return Post
*
* @throws BadRequestException
*
*/
public function edit(Post $post, Request $request): Post
{
$form = $this->createForm(PostType::class, $user);
$form->handleRequest($request);
$form->submit($request->request->all());
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($post);
$em->flush();
return $post;
}
// Any error handling of your taste.
// You could consider expliciting form errors.
throw new BadRequestException();
}
请注意,当然必须创建 Post
实体和 PostType
表单。我不会在这里详细说明,因为在这种情况下对它们没有什么特别要说的。
另请注意,我们不会检查表单是否已提交。将表单呈现为 HTML 在您的情况下是 React 的工作,此操作不会用于 GET 任何内容,它只是一个 PUT 路由。这意味着任何到达那里的请求都必须是一个 PUT 请求,其中包含要由我们的 PostType
处理的正确数据,在您的情况下,通过在 React 中手动构建的 HTML 表单提交。
此外,稍微超出了问题的范围,FOSRestBundle 订阅了您的任何操作 returns 并自动将其序列化为配置的格式(我猜假设您的情况是 JSON)。这意味着我们的动作示例可以 return 两种可能的响应:
- 状态代码为 200 的响应包含我们的序列化 Post。 (您也可以考虑使用 204 而 return 什么都不考虑。)
- 状态代码为 400 的响应包含我们想要的任何内容(比如说表单错误)。
请允许我带您前往FOSRestBundle's documentation。
我正在使用 Symfony 表单组件。我的项目中有很多表格。
要完美地学习表单组件还有很长的路要走,但现在我爱上了它。我也喜欢自动验证等等。
所以。现在我想在我的项目中学习和使用 React.js。
但似乎我无法像以前那样为项目使用验证和表单生成器?我在吗?
可能不是,因为您的表单是供服务器使用的:validation/show errors/data normalization/sanatization/etc.
通常您使用 React 来显示 HTML 并使用 API.
将其连接到您的服务器虽然在 API 上下文中,您不会使用表单组件以 HTML 格式($form->createView()
方法)实际呈现您的表单,但您仍然可以从它提供的所有魔法:验证、表单事件等。API 与否,我个人认为您应该始终在控制器突变中使用表单类型。
例如,使用 FOSRestBundle,考虑一些如下所示的简单控制器操作:
/**
* @Rest\Put("posts/edit/{id}", name="posts.edit", requirements={"id"="\d+"})
*
* @param Post $post
* @param Request $request
*
* @return Post
*
* @throws BadRequestException
*
*/
public function edit(Post $post, Request $request): Post
{
$form = $this->createForm(PostType::class, $user);
$form->handleRequest($request);
$form->submit($request->request->all());
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($post);
$em->flush();
return $post;
}
// Any error handling of your taste.
// You could consider expliciting form errors.
throw new BadRequestException();
}
请注意,当然必须创建 Post
实体和 PostType
表单。我不会在这里详细说明,因为在这种情况下对它们没有什么特别要说的。
另请注意,我们不会检查表单是否已提交。将表单呈现为 HTML 在您的情况下是 React 的工作,此操作不会用于 GET 任何内容,它只是一个 PUT 路由。这意味着任何到达那里的请求都必须是一个 PUT 请求,其中包含要由我们的 PostType
处理的正确数据,在您的情况下,通过在 React 中手动构建的 HTML 表单提交。
此外,稍微超出了问题的范围,FOSRestBundle 订阅了您的任何操作 returns 并自动将其序列化为配置的格式(我猜假设您的情况是 JSON)。这意味着我们的动作示例可以 return 两种可能的响应:
- 状态代码为 200 的响应包含我们的序列化 Post。 (您也可以考虑使用 204 而 return 什么都不考虑。)
- 状态代码为 400 的响应包含我们想要的任何内容(比如说表单错误)。
请允许我带您前往FOSRestBundle's documentation。