Управление данными POST для работы с формами Symfony2 при использовании в REST API - PullRequest
6 голосов
/ 16 февраля 2012

Справочная информация:

Я пишу RESTful API для Symfony. Я хочу, чтобы клиент мог публиковать URL-адреса с использованием типа содержимого application / json и публиковать объект json формы, которую ищет действие контроллера.

Я использую довольно простую настройку контроллера для этого. Предположим в демонстрационных целях, что я пытаюсь аутентифицировать комбо простого имени пользователя и пароля.

public function loginAction( Request $request )
{
    $user = new ApiUser();
    $form = $this->createForm(new ApiUserType(), $user);
    if ( "POST" == $request->getMethod() ) {
        $form->bindRequest($request);
        if ( $form->isValid() ) {
            $em = $this->getDoctrine()->getEntityManager();
            $repo = $this->getDoctrine()->getRepository('ApiBundle:ApiUser');
            $userData = $repo->findOneByUsername($user->getUsername());
            if ( is_object($userData) ) {
                /** do stuff for authenticating **/
            }
            else{
                return new Response(json_encode(array('error'=>'no user by that username found')));
            }
        else{
            return new Response(json_encode(array('error'=>'invalid form')));
        }
    }
}

Теперь проблема, с которой я столкнулся, и пытался ли я использовать var_dumping до тех пор, пока коровы не вернутся домой, заключается в том, что по какой-либо причине symfony не хочет брать тело содержимого application / json и использовать эти данные для заполнения формы данные.

Имя формы: api_apiuser

Поля: имя пользователя, пароль

Как лучше всего справиться с заданием такого типа. Я открыт для предложений, пока я могу заставить это работать. Спасибо, что уделили время.

Ответы [ 3 ]

6 голосов
/ 16 февраля 2012

Вам нужно получить доступ к телу запроса RAW, а затем использовать json_decode.Вам, вероятно, нужно изменить ваш метод bindRequest на что-то вроде следующего:

public function bindRequest(Request $request) 
{
       if($request->getFormat() == 'json') {
           $data = json_decode($request->getContent());
           return $this->bind($data);
        } else {
           // your standard logic for pulling data form a Request object
           return parent::bind($request);
        }
}

Я пока что действительно не связывался с SF2, так что это скорее догадка на основе API, exp.с sf1.x и другими вещами, которые я получил из презентаций на платформе.Также может быть лучше создать совершенно другой метод, например bindJsonRequest, чтобы все было немного более аккуратно.

5 голосов
/ 17 февраля 2012

Я действительно нашел аналогичный способ исправить это, ПОСЛЕ проверки, если метод является post, и перед тем, как привязать запрос к форме, я делаю это:

2 голосов
/ 16 февраля 2012

Да, форма, ожидающая при привязке, - это массив, содержащий ключи, соответствующие вашим свойствам ApiUser.

Так что если вы отправляете запрос POST со строкой:

{ username: 'user', password: 'pass' }

Вам придется преобразовать его в массив, используя json_decode, например:

$data = json_decode($request->getContent()); // $request->request->get('json_param_name');

Затем вы связываете этот массив с формой, используя $form->bind($data);

Форма обновит свойства вашего ApiUser, соответствующие ключам массива (имя пользователя, пароль).

Если вы создаете RESTful json api, я бы посоветовал вам автоматизировать этот процесс с использованием сериализаторов / преобразователей, например https://github.com/schmittjoh/JMSSerializerBundle/blob/master/Resources/doc/index.rst

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...