Laravel Vue.js API:axios 的 PUT 方法不向控制器发送任何数据 [英] Laravel Vue.js API: axios' PUT method doesn't send any data to controller

查看:25
本文介绍了Laravel Vue.js API:axios 的 PUT 方法不向控制器发送任何数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 Laravel 和 Vue.js 中的 API 更新模型中的一些数据但我不能这样做,因为 axios 不向服务器发送任何数据,我在发送之前检查数据并且它们存在(我使用 FormData.append 添加所有字段)

我在使用代码发送之前检查数据:

for(var pair of formData.entries()) {console.log(pair[0]+':'+pair[1]);}

我得到了这个结果:

您可以检查相应的代码:【更新功能】updateStartup() {

 let formData = new FormData();formData.append('startup_logo', this.update_startup.startup_logo);formData.append('country_id', this.update_startup.country_id);formData.append('category_id', this.update_startup.category_id);formData.append('startup_name', this.update_startup.startup_name);formData.append('startup_url', this.update_startup.startup_url);formData.append('startup_bg_color', this.update_startup.startup_bg_color);formData.append('startup_description', this.update_startup.startup_description);formData.append('startup_public', this.update_startup.startup_public);axios.put('/api/startup/' + this.update_startup.id, formData, { headers: {'内容类型':'多部分/表单数据;边界=----WebKitFormBoundary7MA4YWxkTrZu0gW',}}).then(功能(响应){控制台日志(响应);}).catch(函数(错误){控制台日志(错误响应);});}

[我应该接收数据的控制器方法]:

 公共函数更新(请求 $request, $id){返回 $request;//只是为了检查我是否得到数据...}

[带有 vue.js 的 HTML,我使用我在 updateStartup 函数中发送的对象]:

<div class="modalfade editStartUp" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-label="Close"><img src="/admin/images/modal-cross.png" alt="关闭">

<div class="modal-body"><form method="POST" enctype="multipart/form-data" @submit.prevent="updateStartup"><h4 class="sel-c-t">选择类别</h4><div class="submit-fields-wr"><select name="category" v-model="update_startup.category_id" class="selectpicker select-small" data-live-search="true" @change="updateCategoryDe​​tails()"><option v-for="category in category" :value="category.id" :selected="category.id == update_startup.category_id ? 'selected' : ''" >{{ category.name }}</选项></选择><select v-if="update_startup.is_admin" name="country" v-model="update_startup.country_id" class="selectpicker select-small" data-live-search="true" @change="updateCountryDetails()><option v-for="country in countries" :value="country.id" :selected="country.id == update_startup.country_id ? 'selected' : '' ">{{country.name }}</选项></选择>

<div class="submit-fields-wr"><input type="text" placeholder="Startup name" v-model="update_startup.startup_name"><input type="url" v-model="update_startup.startup_url" placeholder="URL">

<textarea v-model="update_startup.startup_description" name="startup_description" placeholder="用一句话描述你的创业公司."></textarea><div v-if="!update_startup.is_admin"><h4 class="sel-c-t bold">联系方式:</h4><div class="submit-fields-wr"><select name="country" v-model="update_startup.country_id" class="selectpicker select-small" data-live-search="true" @change="updateCountryDetails()"><option v-for="country in countries" :value="country.id" :selected="country.id == update_startup.country_id ? 'selected' : '' ">{{country.name }}</选项></选择><input type="text" placeholder="你的名字" v-model="update_startup.contact_name">

<div class="submit-fields-wr"><input type="text" v-model="update_startup.contact_phone" placeholder="您的电话号码"><input type="email" v-model="update_startup.contact_email" placeholder="您的电子邮件地址">

<p class="upl-txt">公司标志.<span>(上传为png文件,小于3mb)</span></p><div class="文件上传"><div class="logo-preview-wr"><div class="img-logo-preview"><img :src="update_startup.startup_logo" alt="标志预览" id="img_preview">

<label for="upload" class="file-upload_label">浏览</label><input id="upload" @change="onFileUpdated" class="file-upload_input" type="file" name="file-upload">

<div class="preview-divider"></div><h4 class="sel-c-t bold">预览:</h4><div class="preview-wrapper-row"><a href="#" class="start-up-wr"><div class="start-up-part-1 edit"><div class="flag-cat-wr"><div class="flag-wr"><img :src="update_startup.country_flag" :alt="update_startup.country_name">

<div class="category-wr">{{ update_startup.category_name }}

<img :src="update_startup.startup_logo" :alt="update_startup.startup_name" class="start-up-logo">

<div class="start-up-part-2"><h4 class="startup-name">{{ update_startup.startup_name }}</h4><p class="startup-description">{{ update_startup.startup_description }}</p>

</a><div class="color-picker-btns-wr"><div><input type="text" class="color_picker" v-model="update_startup.startup_bg_color"><button class="colo_picker_btn">背景颜色</button>

<div class="modal-bottom-btns"><div class="btn-deactivate-active"><button type="submit" class="btn-deactivate" @click="deactivateExistingStartup()">Deactivate</button><button type="submit" class="btn-activate" @click="activateExistingStartup()">激活</button>

</表单>

<!-- 模态编辑-->

[附加信息 - 当我打开模态(我有表单进行更新)时,我会根据启动 ID 相应地更改表单数据]:

showUpdateStartup(startup) {setTimeout(() => {$('.selectpicker').selectpicker('刷新');}, 50);this.update_startup.id = startup.id;this.update_startup.category_id = startup.category.id;this.update_startup.category_name = startup.category.name;this.update_startup.startup_name = startup.name;this.update_startup.startup_description = startup.description;this.update_startup.startup_url = startup.url;this.update_startup.startup_logo = startup.logo;this.update_startup.startup_bg_color = startup.startup_bg_color;this.update_startup.contact_id = startup.contact.id;this.update_startup.contact_name = startup.contact.name;this.update_startup.contact_phone = startup.contact.phone;this.update_startup.contact_email = startup.contact.email;this.update_startup.country_id = startup.contact.country.id;this.update_startup.country_flag = startup.contact.country.flag;this.update_startup.country_name = startup.contact.country.name;this.update_startup.is_admin = startup.contact.is_admin;this.update_startup.startup_public = startup.public;},

如果您有任何其他问题,请告诉我

非常感谢你们的帮助和想法!

解决方案

尝试使用 formData.append('_method', 'PATCH') 和 axios.post 方法.

I'm trying to update some data in Model using API in Laravel and Vue.js but I can't do this because axios doesn't send any data to server, I'm checking the data right before sending and they exist (I use FormData.append to add all fields)

I check data before sending using the code:

for(var pair of formData.entries()) {
   console.log(pair[0]+ ': '+ pair[1]); 
} 

and I get this result:

You can check the appropriate code: [function for updating] updateStartup() {

            let formData = new FormData();
            formData.append('startup_logo', this.update_startup.startup_logo);
            formData.append('country_id', this.update_startup.country_id);
            formData.append('category_id', this.update_startup.category_id);
            formData.append('startup_name', this.update_startup.startup_name);
            formData.append('startup_url', this.update_startup.startup_url);
            formData.append('startup_bg_color', this.update_startup.startup_bg_color);
            formData.append('startup_description', this.update_startup.startup_description);
            formData.append('startup_public', this.update_startup.startup_public);

            axios.put('/api/startup/' + this.update_startup.id, formData, { headers: {
                    'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW',
                }
            })
                .then(function (response) {
                    console.log(response);
                })
                .catch(function (error) {
                    console.log(error.response);
                });

        }

[controller method where I should receive data]:

 public function update(Request $request, $id) {

    return $request; // just for checking if I get data
    ...
 }

[HTML with vue.js where I use object which I send in updateStartup function]:

<!-- Modal edit -->
    <div class="modal fade editStartUp" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <img src="/admin/images/modal-cross.png" alt="Close">
                    </button>
                </div>
                <div class="modal-body">

                    <form method="POST" enctype="multipart/form-data" @submit.prevent="updateStartup">
                        <h4 class="sel-c-t">Select category</h4>

                        <div class="submit-fields-wr">
                            <select name="category" v-model="update_startup.category_id" class="selectpicker select-small" data-live-search="true" @change="updateCategoryDetails()">
                                <option v-for="category in categories" :value="category.id" :selected="category.id == update_startup.category_id ? 'selected' : ''" >{{ category.name }}</option>
                            </select>

                            <select v-if="update_startup.is_admin" name="country" v-model="update_startup.country_id" class="selectpicker select-small" data-live-search="true" @change="updateCountryDetails()">
                                <option v-for="country in countries" :value="country.id" :selected="country.id == update_startup.country_id ? 'selected' : '' ">{{country.name }}</option>
                            </select>
                        </div>

                        <div class="submit-fields-wr">
                            <input type="text" placeholder="Startup name" v-model="update_startup.startup_name">
                            <input type="url" v-model="update_startup.startup_url" placeholder="URL">
                        </div>

                        <textarea v-model="update_startup.startup_description" name="startup_description" placeholder="Describe your startup in a sentence.">

                        </textarea>

                        <div v-if="!update_startup.is_admin">
                            <h4 class="sel-c-t bold">Contact details:</h4>

                            <div class="submit-fields-wr">
                                <select name="country" v-model="update_startup.country_id" class="selectpicker select-small" data-live-search="true" @change="updateCountryDetails()">
                                    <option v-for="country in countries" :value="country.id" :selected="country.id == update_startup.country_id ? 'selected' : '' ">{{country.name }}</option>
                                </select>
                                <input type="text" placeholder="Your Name" v-model="update_startup.contact_name">
                            </div>

                            <div class="submit-fields-wr">
                                <input type="text" v-model="update_startup.contact_phone" placeholder="Your phone number">
                                <input type="email" v-model="update_startup.contact_email" placeholder="Your email address">
                            </div>
                        </div>


                        <p class="upl-txt">Company’s logo.<span>(upload as a png file, less than 3mb)</span></p>

                        <div class="file-upload">
                            <div class="logo-preview-wr">
                                <div class="img-logo-preview">
                                    <img :src="update_startup.startup_logo" alt="logo preview" id="img_preview">
                                </div>
                            </div>

                            <label for="upload" class="file-upload_label">Browse</label>
                            <input id="upload" @change="onFileUpdated" class="file-upload_input" type="file" name="file-upload">
                        </div>

                        <div class="preview-divider"></div>

                        <h4 class="sel-c-t bold">Preview:</h4>

                        <div class="preview-wrapper-row">

                            <a href="#" class="start-up-wr">
                                <div class="start-up-part-1 edit">
                                    <div class="flag-cat-wr">
                                        <div class="flag-wr">
                                            <img :src="update_startup.country_flag" :alt="update_startup.country_name">
                                        </div>
                                        <div class="category-wr">
                                            {{ update_startup.category_name }}
                                        </div>
                                    </div>
                                    <img :src="update_startup.startup_logo" :alt="update_startup.startup_name" class="start-up-logo">
                                </div>
                                <div class="start-up-part-2">
                                    <h4 class="startup-name">{{ update_startup.startup_name }}</h4>
                                    <p class="startup-description">
                                        {{ update_startup.startup_description }}
                                    </p>
                                </div>
                            </a>

                            <div class="color-picker-btns-wr">

                                <div>
                                    <input type="text" class="color_picker" v-model="update_startup.startup_bg_color">
                                    <button class="colo_picker_btn">Background Color</button>
                                </div>

                                <div class="modal-bottom-btns">
                                    <div class="btn-deactivate-active">
                                        <button type="submit" class="btn-deactivate" @click="deactivateExistingStartup()">Deactivate</button>
                                        <button type="submit" class="btn-activate" @click="activateExistingStartup()">Activate</button>
                                    </div>
                                </div>

                            </div>
                        </div>
                    </form>

                </div>
            </div>
        </div>
    </div>
    <!-- Modal edit -->

[Additional info - also when I open modal(where I have form for updating) I change form data accordingly to startup id]:

showUpdateStartup(startup) {

            setTimeout(() => {
                $('.selectpicker').selectpicker('refresh');
            }, 50);

            this.update_startup.id = startup.id;
            this.update_startup.category_id = startup.category.id;
            this.update_startup.category_name = startup.category.name;
            this.update_startup.startup_name = startup.name;
            this.update_startup.startup_description = startup.description;
            this.update_startup.startup_url = startup.url;
            this.update_startup.startup_logo = startup.logo;
            this.update_startup.startup_bg_color = startup.startup_bg_color;
            this.update_startup.contact_id = startup.contact.id;
            this.update_startup.contact_name = startup.contact.name;
            this.update_startup.contact_phone = startup.contact.phone;
            this.update_startup.contact_email = startup.contact.email;
            this.update_startup.country_id = startup.contact.country.id;
            this.update_startup.country_flag = startup.contact.country.flag;
            this.update_startup.country_name = startup.contact.country.name;
            this.update_startup.is_admin = startup.contact.is_admin;
            this.update_startup.startup_public = startup.public;
        },

Let me know if you have any additional questions

Thank you guys a lot for any help and ideas!

解决方案

Try using formData.append('_method', 'PATCH') with axios.post method.

这篇关于Laravel Vue.js API:axios 的 PUT 方法不向控制器发送任何数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
其他开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆