【问题标题】:send and accept parameters inside POST in Laravel在 Laravel 的 POST 中发送和接受参数
【发布时间】:2016-01-23 20:31:02
【问题描述】:

我有基本问题,但我真的找不到简单的答案。我是 Laravel 的新手。我正在尝试在控制器中创建 POST 方法。

Javascript

var url = "ling/public/translation/add";
$.ajax({
            method: "POST",
            url: url,
            data: ko.toJSON(self.wordToAdd)
        });

路线

Route::controller('translation', 'TranslationController');

翻译控制器:

public function postAdd()
{
    return 1;
}

我的问题是我无法理解如何从 Controller 方法 (postAdd) 中的 body 获取参数。我以JSON 格式发送模型。我习惯在 .NET C# 中编程,在里面我会这样写:

public function postAdd(Translation $translation)
{
    // and then use $translation->category_id ...
    return 1;
    }

我的意思是我会发送 JSON,而 .NET 会自动将 JSON 反序列化为类 Translation($translation 变量)。

如何在 Laravel 中做到这一点?

【问题讨论】:

    标签: json laravel post


    【解决方案1】:

    Laravel 确实支持依赖注入。对于public function postAdd(Translation $translation),它将尝试实例化Translation 对象,但不会知道您的json 的任何信息。在这种情况下,您将使用Request 对象,然后解码json

    public function postAdd(Request $request){
    
       // Pass the second paramater as true to return an associative array
       $translation = json_decode($request->data, true);
    
       // build your Translation object from the json
    
       return 1;
    }
    

    如果您只是想保存Translation,我希望您解码后的 json 格式正确,因此您应该可以这样做:

    App\Translation::create($translation);

    同样重要的是要注意 Laravel 需要 posts 才能包含 csrf token,所以你需要在你的 ajax 中传递它,我可以看到你正在使用 knockoutjs,所以你可以把它包装在一个自定义绑定,类似于:

    ko.bindingHandlers.postJson = {
        init: function (element, valueAccessor) {
            var values = valueAccessor() || {};
            var token = values.token;
            var wordToAdd = values.data
    
            var json = ko.toJSON(wordToAdd);
    
            $(element).on('click', function () {
                $.ajax({
                    url: 'translation/add',
                    method: 'post',
                    data: {'data' : json, '_token': token },
                    success : function(data){
                        console.log(data);
                    },
                    error : function(e){
                      console.log('Error! '+ e);
                    }
                });
            });
        }
    };
    

    然后将其绑定到您的页面元素:

    <input type="button" value="Add Word" data-bind="postJson : {token : '{{ csrf_token() }}', data : $root.wordToAdd }" /> 
    

    【讨论】:

    • 但是如果我从中间件 csrf 文件中删除了怎么办?我可以这样做吗?
    • 如果您已从app\Http\kernel.php 的中间件中删除了VerifyCsrfToken 类,则不需要令牌,您可以将其省略。虽然,它非常有用,所以我会留下它,除非有理由不这样做。
    • 无论如何,我在 Container.php 第 744 行收到“BindingResolutionException:目标 [App\Http\Requests\Request] 不可实例化。”现在例外。我添加了使用 App\Http\Requests\Request;控制器内部。也许这里有一些问题。
    • 但是如果我删除这个使用,我会得到“Class App\Http\Controllers\Request 不存在”
    • 我觉得应该是use Illuminate\Http\Request;
    猜你喜欢
    • 2018-04-23
    • 2016-04-13
    • 2019-10-31
    • 2011-11-29
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多