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"}
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
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();
});
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'];
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 Request
reste 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.
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.