- 首页
- 其他开发
- Laravel Vue.js API:axios 的 PUT 方法不向控制器发送任何数据
Laravel Vue.js API:axios 的 PUT 方法不向控制器发送任何数据
[英] Laravel Vue.js API: axios' PUT method doesn't send any data to controller
本文介绍了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="updateCategoryDetails()"><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屋!
查看全文