Проводка JSON To Laravel

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

угловой:

$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"} 

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

 $data = Input::all(); $data['id']; // The ID of the request 

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

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

Кроме того, как и в документации Laravel 5.1 , все ссылки на фасад Request были удалены, опять же предпочтение от непосредственного использования экземпляра Illuminate\Http\Request , который он поощряет вас делать посредством инъекции зависимостей:

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

 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 остается по умолчанию .

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

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

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

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