Я пытаюсь сделать почтовый запрос 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.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(); });
Стоит отметить, что $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); }
В нетривиальных примерах вы можете также сначала проверить свой ввод.