web-dev-qa-db-ja.com

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が有効であり、コントローラー+メソッド(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"}
34
Joel_Blum

Laravel's Input::allメソッドは、PHPのstdClassのオブジェクトではなく、連想配列を返します。

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

更新:Laravel 5

Laravel 5.0の時点で、Inputファサードが 公式ドキュメント から削除されていることに注意してください(5.2では リストから削除 提供されているデフォルトのファサード)Requestが呼び出すInputクラス(_Illuminate\Http\Request_)を直接使用することを支持します。

また、Laravel 5.1documentation の時点で、Requestfacadeへのすべての参照は再び_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()およびParameterBag

$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ファサード デフォルト

これは、1つcouldがまだRequestファサードを使用してリクエストのメソッドを呼び出すことを暗示しているようですinstance(例Request::json())依存性注入を使用することは、単に公式に推奨される方法に過ぎません。

48
jdunk

上記を展開(および修正)するには、Laravel 5で次のようにJSONを取得します。

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

重要な例では、最初に入力を検証することもできます。

7
Pete Thorne