Отправка JSON в Laravel

30

Я пытаюсь сделать почтовый запрос json в Laravel. Запрос получен на сервере, однако, когда я пытаюсь получить доступ к свойству, я получаю: "Попытка получить свойство не-объекта" . На клиенте я использую angularjs.

angular:

$http.post($rootScope.globals.basePath+"login/handleAjax",{"id" : obj.values[0].id,"profileUrl" : obj.values[0].publicProfileUrl}).success(function(data){
             console.log("got success!",data);
         });

laravel:

class LoginController extends BaseController {
/*User logs in to linkedin and sends his id through ajax to this function*/
public function handle_ajax() {
    $data = Input::all();
    *//Clockwork is just a debugging extension I'm using*
    Clockwork::info($data->id); **//"Trying to get property of non-object".**
}

Примечание. В Fiddler я вижу, что отправленный JSON действителен и что он достигает метода контроллера + (http 200).

Сам по себе запрос (как видно с Fiddler)

Headers: 
Accept: application/json, text/plain, */*
...
Text View:
{"id":"my id","profileUrl":"http://www.linkedin.com/pub/yoel-blum/51/373/76"}
  • 2
    Разве это не Input::json()->all() ?
  • 1
    Laravel не знает, что вы опубликовали JSON. Вам придется json_decode самостоятельно или использовать Input::json()->all() который еще не документирован, хотя в источниках ( github.com/laravel/framework/blob/master/src/Illuminate/Http/ … )
Показать ещё 1 комментарий
Теги:

3 ответа

11
Лучший ответ

Метод Laravel Input::all возвращает ассоциативный массив, а не объект PHP stdClass.

$data = Input::all();
$data['id']; // The ID of the request
  • 1
    Я не использую all() но json() выведет полученный json
39

Обновление: Laravel 5

Обратите внимание, что в Laravel 5.0 фасад Input удален из официальной документации (и в 5.2 он также был удален из списка по умолчанию предоставленных Фасадов) в пользу прямого использования класса Request, вызываемого Input, который Illuminate\Http\Request.

Кроме того, в документации Laravel 5.1 рекомендует вам делать через инъекцию зависимости:

... ваш метод контроллера:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function update(Request $request, $id)
    {
        $data = $request->json()->all();
    }
}

... или закрытие маршрута (с 5.3):

use Illuminate\Http\Request;

Route::get('/', function (Request $request) {
    $data = $request->json()->all();
});

json() и ParameterBag

Стоит отметить, что $request->json() возвращает экземпляр Symfony\Component\HttpFoundation\ParameterBag, а метод ParameterBag ->all() возвращает ассоциативный массив, а не объект, ожидаемый OP.

Итак, теперь вы получите приблизительный эквивалент $_POST['id'] следующим образом:

$data = $request->json()->all();
$id = $data['id'];

"Входные" и "Запросные" фасады: Текущий статус

Оба фасада были удалены из официальной документации (от 5.1), и тем не менее они оба также остаются в исходном коде без метки "устаревшей".

Как упоминалось ранее, Input был удален как фасад по умолчанию ('alias') в 5.2, но с 5.4, Request facade остается по умолчанию.

Это, по-видимому, подразумевает, что все-таки можно использовать фасад Request для вызова методов экземпляра Request (например, Request::json()), но с использованием инъекции зависимостей теперь просто официально предпочтительный метод.

  • 0
    Любая идея, как получить объект stdClass из этого ParameterBag , а не массива?
  • 3
    @DrakeES Вам нужно будет просто привести его как объект: (object) Request::json()->all() так как ParameterBag хранятся внутри как ассоциативный массив, и в настоящее время нет «возврата как объект "вариант. Смотрите также этот вопрос: stackoverflow.com/questions/19272011/…
Показать ещё 2 комментария
6

Чтобы развернуть (и исправить) выше, в Laravel 5 вы получите JSON, как показано:

public function handle_ajax(Request $request) {
    $data = (object) $request->json()->all();
    Clockwork::info($data->id);
}

В нетривиальных примерах вы также можете сначала подтвердить свой ввод.

  • 0
    Спасибо, что [косвенно] обратили на это мое внимание @Pete. Мой ответ в то время был верным для Laravel 5.0, но это было действительно позже (когда вышла 5.1+), а затем несколько неточно, чтобы сказать просто: «В Laravel 5 вы хотите Request :: json-> all ()» - - хотя это на самом деле все еще полностью работает - потому что оно было удалено из документации (хотя и не из исходного кода) в пользу того, что вы отметили здесь. Я обновил свой ответ соответственно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню