Ваша проблема связана с тем, что я наткнулся на Symfony3, и с тех пор я пробовал различные методы обработки содержимого, отправляемого через AJAX.
Получение данных AJAX
Эта часть проста, в контроллере просто позвоните $data = $request->getContent();
Создайте службу
Создайте службу для обработки данных такого типа.Он использует валидатор Symfony (см. Конструктор: ValidatorInterface
) и имеет метод с именем validateAndCreate
, который принимает в качестве параметра $data
(который является содержимым тела запроса AJAX) и $entityClassName
(который является объектом для созданияи заполните данные, например: User::class
сгенерирует строку имени класса)
Нормализатор, Кодировщик и Сериализатор
Эти три будут важны при обработке вашего содержимого AJAX.$data
может быть десериализовано и введено непосредственно в экземпляр сущности (созданный из параметра ClassName)
Если данные отправляются как JSON
, тогда используйте JsonEncoder
, как только объект сериализатора создан, он 'Вы сможете десериализовать данные JSON непосредственно во вновь созданный объект (параметр className in используется для создания объекта).
После того, как объект сгенерирован, используйте валидатор, чтобы проверить и проверить, является ли он действительнымобъект.Я рекомендую использовать @Assert
во всех объектах Entity для правильной работы валидатора.
class ApiService
{
private $validator;
public function __construct(ValidatorInterface $validator)
{
$this->validator = $validator;
}
public function validateAndCreate($data, $entityClassName){
$objectNormalizer = new ObjectNormalizer();
$normalizers = [$objectNormalizer];
$encoders = [new JsonEncoder()];
$serializer = new Serializer($normalizers, $encoders);
$result = $serializer->deserialize($data, $entityClassName, 'json');
$errors = $this->validator->validate($result);
if(count($errors) > 0){
throw new CustomApiException(Response::HTTP_BAD_REQUEST, (string) $errors);
}
return $result;
}
}
Пример использования в контроллере для создания нового собрания
public function newMeeting(Request $request, ApiService $apiService, FractalService $fractalService){
/** @var Admin $admin */
$admin = $this->getUser();
/** @var UserRepository $rep */
$em = $this->getDoctrine()->getManager();
$data = $request->getContent();
if(empty($data)) throw new CustomApiException(Response::HTTP_BAD_REQUEST, "Data sent null.");
/** @var Meeting $test */
$meeting = $apiService->validateAndCreate($data, Meeting::class);
$meeting->setAdmin($admin);
$admin->addMeeting($meeting);
$em->persist($test);
$em->flush();
//Return data however you wish, I use a FractalService
$data = $fractalService->generateData($meeting, MeetingTransformer::class, 'meeting');
return $fractalService->generateResponse($data);
}
На стороне клиентапример обработки формы для AJAX
$("#form").on("submit", function(e){
e.preventDefault();
let data = {};
$(this).serializeArray().forEach((object)=>{
data[object.name] = object.value;
});
console.log(data);
//TODO: ajax call here with data
//If ajax call fails because server can't decode
//Think of doing : data = JSON.stringify(data);
console.log(JSON.stringify(data));
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="form">
<input type="text" value="john" name="firstname"/>
<input type="text" value="smith" name="lastname"/>
<input type="text" value="florida" name="address"/>
<input type="text" value="1234512345" name="phonenumber"/>
<input type="text" value="john.smith@gmail.com" name="email"/>
<input type="submit" value="submit this"/>
</form>