Laravel解析嵌套的序列化查询字符串

时间:2016-07-05 21:07:24

标签: php angularjs laravel http laravel-5

我试图将一组嵌套的查询参数传递给我的Laravel 5.1 API。我正在使用$httpParamSerializer(params)序列化对象,这似乎正确地执行了GET看起来像:

GET "http://my-api.localhost/1.0/categories?category=Anatomy&category=Consent+Forms"

然而,当我从Laravel返回$request时,它只显示其中一个属性:

Object {category: "Consent Forms"}

为什么会这样?

Angular Frontend:

        var filters = {
            category : ['Anatomy', 'Consent Forms']
        };

        Category.getCategories(filters).then(function(res) {
            // Object {category: "Consent Forms"}
            console.log('CATEGORIES', res.data);

Angular HTTP Request:

        getCategories: function(params) {
            var qs = $httpParamSerializer(params);
            return $http({
                method: 'GET',
                url: url + ver + '/categories?' + qs,
                headers: Auth.getOAuthHeader(),
                cache: true
            });
        },

Laravel:

public function getCategories(Request $request) {
    $input = $request->all();
    return $input;

1 个答案:

答案 0 :(得分:1)

问题是$httpParamSerializer的默认行为是在数组的每个值的url中输出相同的键,PHP在最后设置的基础上处理,因此只设置了最后一个键值par。

来自documentation

{'foo': ['bar', 'baz']} results in foo=bar&foo=baz (repeated key for each array element)

您可以使用$httpParamSerializerJQLike服务来处理受jQuery .param()启发的网址编码数据流程。

使用$httpParamSerializerJQLike参数:

category : ['Anatomy', 'Consent Forms']

将成为:

?category[]=Anatomy&category[]=Consent+Forms

要使用$httpParamSerializerJQLike,您需要将其注入Controller中。例如

.controller('AppCtrl', function($scope, $http, $httpParamSerializer, $httpParamSerializerJQLike) {

使用它来序列化您的数据:

getCategories: function(params) {
    var qs = $httpParamSerializerJQLike(params);
    return $http({
        method: 'GET',
        url: url + ver + '/categories?' + qs,
        headers: Auth.getOAuthHeader(),
        cache: true
    });
},