我正在使用Symfony表单组件,我的项目中有很多表单。
要完全学习表单组件需要走很长的路程,但现在我喜欢它。我也喜欢自动验证等功能。
所以,现在我想在我的项目中学习并使用React.js。
但是看起来,我不能像以前那样使用验证和表单构建器来进行项目?我这样说对吗?
Original Answer翻译成"最初的回答"
我正在使用Symfony表单组件,我的项目中有很多表单。
要完全学习表单组件需要走很长的路程,但现在我喜欢它。我也喜欢自动验证等功能。
所以,现在我想在我的项目中学习并使用React.js。
但是看起来,我不能像以前那样使用验证和表单构建器来进行项目?我这样说对吗?
Original Answer翻译成"最初的回答"
$form->createView()
方法),但您仍然可以从它所提供的所有魔力中受益:验证、表单事件等等。无论是否使用API,我个人认为您应该始终在控制器 mutations 中使用表单类型。/**
* @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
表单。在此上下文中,关于它们没有什么特别的内容,因此我不会详细说明。PostType
来处理。您可以毫无问题地使用由formBuilder创建的表单。
您必须使用axios获取您的表单并创建一个新组件,如下所示:
const url = 'localhost/post/new';
const ref = useRef(null);
const [form, setForm] = useState('');
const fetchData = () => {
axios.get(url))
.then(function (response){
setForm(response.data);
})
.catch(function (error){
//something
})
;
}
const MyComponent = () => {
useEffect(() => {
const element = ref.current.firstChild;
if (ref.current.firstChild === null)
return;
element.addEventListener('submit', () => {handleSave(event)});
return () => {
element.removeEventListener('submit', () => {handleSave(event)});
};
}, []);
return (
<div ref={ref} dangerouslySetInnerHTML={{ __html: form }} />
);
};
const handleSave = (event) => {
event.preventDefault();
let formData = new FormData(event.target)
let action = event.target.action;
let files = event.target.querySelectorAll('[type="file"]');
if (files)
files.forEach((file) => {
formData.set(file.name, file.files[0])
});
axios.post(action, formData)
.then(function (response) {
Swal.fire({
icon: 'success',
title: response.data.message,
showConfirmButton: false,
timer: 1500
})
//Do something else
})
.catch(function (error) {
error.response.status === 422 ?
setForm(error.response.data)
:
console.log(error);
});
}
return (<MyComponent/>);
现在,您可以使用HTML组件获取表单并使用React组件呈现它。
如果出现验证错误,则会收到422状态,并且您可以使用setForm()替换表单。
在您的Symfony控制器中,您必须设置类似于以下内容:
#[Route('/post/{state}/{id}', name: 'post', defaults: ['state' => null, 'id' => null])]
public function post(
?string $state,
?int $id,
Request $request,
EntityManagerInterface $em
): JsonResponse|Response
{
if ($state == 'new') {
$post = new Post();
$form = $this->createFormBuilder()
->add('title', TextType::class)
->add('content', TextareaType::class);
$form = $form->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() and $form->isValid()) {
$em->persist($post);
$em->flush();
return $this->json(['message' => 'post added!'], 200);
}
return $this->renderForm('{{ form(form) }}', [
'form' => $form
]);
}
}
可能不是因为您的表单是用于服务器使用的:验证/显示错误/数据规范化/净化等。
通常,您使用React来显示HTML并使用API将其连接到服务器。