web-dev-qa-db-fra.com

Publication de JSON dans Laravel

J'essaie de faire une demande de poste de JSON à Laravel. La demande est reçue sur le serveur, cependant, lorsque je tente d'accéder à une propriété, je reçois: "Essayer d'obtenir une propriété de non-objet". Sur le client, j'utilise angularjs.

angulaire:

$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".**
}

Remarque: dans Fiddler, je peux voir que le JSON envoyé est valide et qu’il atteint la méthode contrôleur + (http 200).

Le message demande lui-même (comme on le voit avec 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

La méthode Input::all De Laravel renvoie un tableau associatif et non un objet de la classe stdClass de PHP.

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

Mise à jour: Laravel 5

Veuillez noter qu'à partir de Laravel 5.0 , la façade Input a été supprimée de la documentation officielle (et dans 5.2, il était également retiré de la liste des façades par défaut fournies) en faveur de l’utilisation directe de la classe Request que Input invoque, ce qui correspond à Illuminate\Http\Request .

En outre, à partir de Laravel 5.1 documentation , toutes les références à la Request façade ont été supprimés, encore une fois de préférence en utilisant l’instance Illuminate\Http\Request directement, ce qu’il vous encourage à faire via une injection de dépendance dans:

... votre méthode de contrôleur:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function update(Request $request, $id)
    {
        $data = $request->json()->all();
    }
}

... ou une fermeture d'itinéraire (à partir de 5.3 ):

use Illuminate\Http\Request;

Route::get('/', function (Request $request) {
    $data = $request->json()->all();
});

json () et ParameterBag

Il est à noter que $request->json() renvoie une instance de Symfony\Component\HttpFoundation\ParameterBag, Et que la méthode ParameterBag de ->all() renvoie une méthode associative. array , et non un objet tel que l'OP attendu.

Donc, on chercherait maintenant l'équivalent approximatif de $_POST['id'] comme suit:

$data = $request->json()->all();
$id = $data['id'];

Façades `Input` et` Request`: état actuel

Les deux façades ont été retirées de la documentation officielle (à partir de 5.1 ), et pourtant les deux restent également dans le code source sans 'obsolète' 'étiquette.

Comme mentionné précédemment, Input a été supprimé comme façade par défaut ('alias') dans la version 5.2, mais à partir de la version 5.4, la façade Requestreste une par défaut .

Cela semble impliquer que l'on pourrait utiliser encore la façade Request pour appeler des méthodes sur la requête instance (par exemple, Request::json()), mais l’utilisation de l’injection de dépendance est tout simplement la méthode officiellement privilégiée.

48
jdunk

Pour développer (et corriger) ce qui précède, dans Laravel 5, vous récupérerez JSON comme indiqué:

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

Dans des exemples non triviaux, vous voudrez peut-être aussi d'abord valider votre entrée.

7
Pete Thorne