【发布时间】:2020-05-11 11:02:34
【问题描述】:
我正在使用 Symfony 表单来修改我的“上下文”实体,但我无法从 ajax 请求中获取数据以修改我的实体。我找到了另一种方法来做我需要的事情(如下),但我没有使用 handleRequest :
上下文控制器:
public function share(Request $request, Context $context, UsersRepository $usersRepository)
{
$users = $usersRepository->findAll();
$form = $this->createForm(ShareContextType::class, $context, ['users' => $users]);
// Envoie du formulaire de partage de contexte en ajax
if ($request->isXmlHttpRequest() && $request->isMethod('GET')) {
$template = $this->render('context/share.html.twig', [
'form' => $form->createView(),
])->getContent();
$json = json_encode($template);
return new JsonResponse($json);
// Requête post avec les id's des utilisateurs pour le partage de context
} elseif ($request->isXmlHttpRequest() && $request->isMethod('POST')) {
$reponse = $request->getContent();
$json = json_decode($reponse);
$formArray = [];
// Ajoute chaque utilisateur aux tableaux d'utilisateurs de ce contexte
foreach ($json as $userId) {
$user = $usersRepository->find($userId);
$context->addUser($user);
$formArray[] = $user;
}
// Si l'utilisateur n'est pas présent dans le tableaux de la requête
// alors supprime l'utilisateur du tableau du contexte
foreach ($context->getUsers() as $user) {
if (!in_array($user, $formArray, true)) {
$context->removeUser($user);
}
}
$this->getDoctrine()->getManager()->flush();
return new JsonResponse(['success' => 'Ok']);
}
我的 JS:
$('#share-context-form').submit(function(e) {
e.preventDefault();
formData = $('#share_context_users').val();
sendShareContext(formData, $('#context-id').val());
})
function sendShareContext(formData, contextId) {
$.ajax({
type: 'POST',
url: '/contextes/' + contextId + '/share',
data: JSON.stringify(formData),
headers: {
'Content-Type': 'application/json',
Accept: 'application/json'
},
async: true,
(...)
效果很好。但是如果我尝试在我的 JS 中做:
$formData = $('#share-context-form').serialize();
并让我的 Controller 中的序列化对象执行以下操作:
$form->handleRequest($request);
if ($form->isValid()) {
(...)
}
它不起作用,因为当我尝试获取 $request 内容时,我实际上得到了类似的东西:
$request->getContent() // Output : "share_context%5Busers%5D%5B%5D=25&share_context%5B…en%5D=vrWCjceU9LVGVrSKyMggRdXNNjeG4KTBDLW0HqIh3aQ"
我也尝试用 Symfony 的 SerializerInterface 反序列化它,这样做:
$serializer->deserialize($form, ShareContextType::class, 'json');
但它也不起作用。 如果您有一些想法,我将不胜感激。谢谢!
【问题讨论】:
标签: ajax forms symfony json-deserialization