Отправка 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"}
3 answers
Метод Laravel Input::all
возвращает ассоциативный массив, а не объект стандартного класса PHP.
$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() и параметр
Стоит отметить, что $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()
), но использование внедрения зависимостей просто теперь официально предпочтительный метод.
Чтобы расширить (и исправить) вышесказанное, в Laravel 5 вы бы извлекли JSON, как показано на рисунке:
public function handle_ajax(Request $request) {
$data = (object) $request->json()->all();
Clockwork::info($data->id);
}
В нетривиальных примерах вы можете также сначала проверить свои входные данные.