将JSON发布到Laravel

Joe*_*lum 34 php laravel angularjs

我正在尝试向Jaravel发送json的帖子请求.请求在服务器上收到,但是当我尝试访问属性时,我得到: "试图获取非对象的属性".在客户端我正在使用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);
         });
Run Code Online (Sandbox Code Playgroud)

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".**
}
Run Code Online (Sandbox Code Playgroud)

注意:我可以在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"}
Run Code Online (Sandbox Code Playgroud)

jdu*_*unk 48

更新:Laravel 5

请注意,从Laravel 5.0开始,Input外观已从官方文档中删除(在5.2中它也提供的默认Facade 列表删除),支持直接使用调用的RequestInput,即Illuminate\Http\Request.

此外,从Laravel 5.1 文档开始,对Request Facade的所有引用都已被删除,同样优先于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();
    }
}
Run Code Online (Sandbox Code Playgroud)

......或路线封闭(截至5.3):

use Illuminate\Http\Request;

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

json()和ParameterBag

这是值得注意的是,$request->json()返回的一个实例Symfony\Component\HttpFoundation\ParameterBag,这ParameterBag->all()方法返回一个关联数组,而不是一个对象的要求的OP.

所以人们现在可以获得$_POST['id']如下粗略的等价物:

$data = $request->json()->all();
$id = $data['id'];
Run Code Online (Sandbox Code Playgroud)

`输入`和`请求`外观:当前状态

两个外墙都已从官方文档中删除(从5.1开始),但它们都保留源代码中,没有"弃用"标签.

如前所述,在5.2中作为默认外观('别名')Input被删除,但从5.4开始,Request外观仍然是默认设置.

这似乎意味着仍然可以使用RequestFacade来调用Request 实例上的方法(例如Request::json()),但是使用依赖注入现在只是官方首选的方法.

  • @DrakeES你需要把它作为一个对象:`(object)Request :: json() - > all()`因为`ParameterBag`的params在内部存储为一个关联数组,目前有没有"作为对象返回"选项.另见这个问题:http://stackoverflow.com/questions/19272011/how-to-convert-an-array-into-an-object-using-stdclass (3认同)

Jac*_*din 12

Laravel的Input::all方法返回一个关联数组,而不是PHP的stdClass的对象.

$data = Input::all();
$data['id']; // The ID of the request
Run Code Online (Sandbox Code Playgroud)


Pet*_*rne 7

要扩展(并纠正)上述内容,在Laravel 5中,您将检索JSON,如下所示:

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

在非平凡的示例中,您可能还想先验证输入.