Отправка JSON В 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);
         });

Ларавель:

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 действителен и что он достигает метода controller+ (http 200).

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

Headers: 
Accept: application/json, text/plain, */*
...
Text View:
{"id":"my id","profileUrl":"http://www.linkedin.com/pub/yoel-blum/51/373/76"}
Author: Joel_Blum, 2014-01-19

3 answers

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

$data = Input::all();
$data['id']; // The ID of the request
 12
Author: Jacob Budin, 2014-01-19 17:02:52

Обновление: 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() и параметр

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

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

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

Фасады "Ввод" и "Запрос": Текущее состояние

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

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

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

 40
Author: jdunk, 2017-02-11 01:59:08

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

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

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

 7
Author: Pete Thorne, 2016-03-15 15:08:34