Подтвердить что ты не робот

Проводка JSON To Laravel

Я пытаюсь сделать почтовый запрос 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"}
4b9b3361

Ответ 1

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

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

Ответ 2

Обновление: 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()), но с использованием инъекции зависимостей теперь просто официально предпочтительный метод.

Ответ 3

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

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

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