Публикация объектов JSON в Symfony 2 - PullRequest
69 голосов
/ 01 марта 2012

Я работаю над проектом с использованием Symfony 2, я создал пакет для обработки всех моих служб баз данных, который передает данные JSON туда и обратно.

Моя проблема / вопрос:

  • Можно ли опубликовать объект JSON с прямым доступом?В настоящее время я подделываю сообщение обычной формы для своих вызовов ajax, присваивая объекту имя json={"key":"value"}, если я не даю ему имя, я не могу получить данные из объекта запроса Symfony $JSON = $request->request->get('json');

  • Я хочу иметь возможность использовать один пакет услуг для обработки как данных, поступающих от вызовов AJAX, так и обычной формы Symfony.В настоящее время я принимаю отправленную форму Symfony, получаю данные и затем использую JSON_ENCODE. Я просто не могу понять, как отправить данные на мой контроллер служб, который ожидает данные запроса.

Подводя итог:

  • Я хочу, чтобы Symfony принимал пост-объект JSON, а не форму.

  • Я хочу передать объект JSON между контроллерами, используя запрос / ответ

Если я все делаю неправильно, не стесняйтесь, скажите мне об этом!

Ответы [ 3 ]

134 голосов
/ 05 марта 2012

Если вы хотите получить данные в вашем контроллере, которые были отправлены в виде стандартного JSON в теле запроса, вы можете сделать нечто подобное:

public function yourAction()
{
    $params = array();
    $content = $this->get("request")->getContent();
    if (!empty($content))
    {
        $params = json_decode($content, true); // 2nd param to get as array
    }
}

Теперь $params будет массивом, полным ваших данных JSON. Удалите значение параметра true в вызове json_decode(), чтобы получить объект stdClass.

9 голосов
/ 15 апреля 2015

Я написал метод для получения содержимого в виде массива

protected function getContentAsArray(Request $request){
    $content = $request->getContent();

    if(empty($content)){
        throw new BadRequestHttpException("Content is empty");
    }

    if(!Validator::isValidJsonString($content)){
        throw new BadRequestHttpException("Content is not a valid json");
    }

    return new ArrayCollection(json_decode($content, true));
}

И я использую этот метод, как показано ниже

$content = $this->getContentAsArray($request);
$category = new Category();
$category->setTitle($content->get('title'));
$category->setMetaTitle($content->get('meta_title'));
1 голос

JavaScript на странице:

function submitPostForm(url, data) {
    var form                = document.createElement("form");
        form.action         = url;
        form.method         = 'POST';
        form.style.display  = 'none';

    //if (typeof data === 'object') {}

    for (var attr in data) {
        var param       = document.createElement("input");
            param.name  = attr;
            param.value = data[attr];
            param.type  = 'hidden';
        form.appendChild(param);
    }

    document.body.appendChild(form);
    form.submit();
}

после некоторого события (например, нажмите «отправить»):

// products is now filled with a json array
var products = jQuery('#spreadSheetWidget').spreadsheet('getProducts');
var postData = {
'action':   action,
'products': products
}
submitPostForm(jQuery('#submitURLcreateorder').val(), postData);

в контроллере:

   /**
    * @Route("/varelager/bestilling", name="_varelager_bestilling")
    * @Template()
    */
   public function bestillingAction(Request $request) {
       $products   = $request->request->get('products', null); // json-string
       $action     = $request->request->get('action', null);

       return $this->render(
           'VarelagerBundle:Varelager:bestilling.html.twig',
           array(
               'postAction' => $action,
               'products' => $products
           )
       );
   }

в шаблоне (bestilling.html.twig в моем случае):

  {% block resources %}
       {{ parent() }}
       <script type="text/javascript">
       jQuery(function(){
           //jQuery('#placeDateWidget').placedate();
           {% autoescape false %}
           {% if products %}

           jQuery('#spreadSheetWidget').spreadsheet({
               enable_listitem_amount: 1,
               products: {{products}}
           });
           jQuery('#spreadSheetWidget').spreadsheet('sumQuantities');
           {% endif %}
           {% endautoescape %}

       });
       </script>
   {% endblock %}

Alrite, я думаю, это то, что ты хотел :)

EDIT Для отправки чего-либо без моделирования формы вы можете использовать jQuery.ajax (). Вот пример в том же духе, что и выше, который не вызовет обновление страницы.

jQuery.ajax({
    url:        jQuery('#submitURLsaveorder').val(),
    data:       postData,
    success:    function(returnedData, textStatus, jqXHR ){
        jQuery('#spreadSheetWidget').spreadsheet('clear');
        window.alert("Bestillingen ble lagret");
        // consume returnedData here

    },
    error:      jQuery.varelager.ajaxError, // a method
    dataType:   'text',
    type:       'POST'
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...