Я пытаюсь сделать почтовый запрос 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"}
Метод Laravel Input::all
возвращает ассоциативный массив, а не объект PHP stdClass.
$data = Input::all();
$data['id']; // The ID of the request
all()
но json()
выведет полученный json
Обратите внимание, что в 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();
});
Стоит отметить, что $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()
), но с использованием инъекции зависимостей теперь просто официально предпочтительный метод.
ParameterBag
, а не массива?
(object) Request::json()->all()
так как ParameterBag
хранятся внутри как ассоциативный массив, и в настоящее время нет «возврата как объект "вариант. Смотрите также этот вопрос: stackoverflow.com/questions/19272011/…
Чтобы развернуть (и исправить) выше, в Laravel 5 вы получите JSON, как показано:
public function handle_ajax(Request $request) {
$data = (object) $request->json()->all();
Clockwork::info($data->id);
}
В нетривиальных примерах вы также можете сначала подтвердить свой ввод.
Input::json()->all()
?json_decode
самостоятельно или использоватьInput::json()->all()
который еще не документирован, хотя в источниках ( github.com/laravel/framework/blob/master/src/Illuminate/Http/ … )