laravel - Laravel,Vue Js 与 Vuetify 和 Vuelidate
问题描述
我想问一下Laravel和Vue JS 中的验证。
在这里,我将Vue JS与Laravel分开使用。然后我很困惑使用后端和前端的验证,或者比其中一个更好。
在Vue JS的这种情况下,我使用Vuetify、Vuelidate和Vuex。
我已经尝试使用Vuelidate对Vuetify进行验证,这非常简单。
但是我很困惑选择,我是否足以仅在 Vue中进行验证?或者仍然检索仅从Backend发送的所有错误响应。
如果我只在前端使用验证,让我感到困惑的并不是我能做的一切。例如验证图像类型、图像大小、唯一数据等。
我害怕的只是在Frontend上进行验证。我必须重建,我认为这非常低效。
这是我在Vue JS中验证的一个示例。
<template>
<v-container
fluid
tag="section"
>
<v-row
align="center"
justify="center"
>
<v-col
cols="12"
>
<form>
<v-text-field
class="mb-5"
v-model="form.title"
:error-messages="errors.title"
:counter="10"
label="Title"
required
dense
@input="$v.form.title.$touch()"
@blur="$v.form.title.$touch()"
></v-text-field>
<quill-editor
class="mb-5"
v-model="form.content"
:options="editorOption"
></quill-editor>
<p class="display-6" v-if="errors.content">{{ errors.content }}</p>
<v-file-input
class="mb-5"
:error-messages="errors.image"
v-model="form.image"
label="File input"
chips
dense
clear-icon
@validate-on-blur="$v.form.image.$touch()"
>
</v-file-input>
<v-select
class="mb-5"
:items="items"
label="Category"
dense
chips
counter
></v-select>
<v-text-field
class="mb-5"
v-model="form.slug"
:counter="10"
label="Slug"
required
dense
:error-messages="errors.slug"
@input="$v.form.slug.$touch()"
@blur="$v.form.slug.$touch()"
></v-text-field>
<v-btn class="mr-4" @click="submit">submit</v-btn>
<v-btn @click="clear">clear</v-btn>
</form>
</v-col>
</v-row>
</v-container>
</template>
<script>
// * Package
import { mapState, mapMutations } from 'vuex'
import { quillEditor } from 'vue-quill-editor'
import { validationMixin } from 'vuelidate'
import { required } from 'vuelidate/lib/validators'
// * Css
import 'quill/dist/quill.snow.css'
export default {
name: 'Store.Articles',
components: {
quillEditor
},
mixins: [validationMixin],
validations: {
form: {
title: { required },
slug: { required }
}
},
data() {
return {
editorOption: {
placeholder: 'Type your post...',
readOnly: true,
theme: 'snow'
},
items: [
'News', 'Promo', 'Maintenance'
]
}
},
computed: {
...mapState(['errors']),
...mapState('article', {
form: state => state.form
}),
titleErrors () {
if (!this.$v.form.title.$dirty) return errors
!this.$v.form.title.required && errors.push('Title is required.')
return errors
},
slugErrors () {
if (!this.$v.form.slug.$dirty) return errors
!this.$v.form.slug.required && errors.push('Slug is required.')
return errors
},
},
methods: {
...mapMutations('article', ['CLEAR_FORM']),
submit () {
this.$v.$touch()
if (!this.$v.$invalid) {
console.log('valid');
}
},
clear () {
this.$v.$reset()
this.CLEAR_FORM()
},
},
destroyed() {
this.CLEAR_FORM()
}
}
</script>
<style>
.ql-editor {
height: 40vh;
}
</style>
这是我从Laravel得到的验证。
namespace App\Http\Requests\API\Admin\Article;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
use App\Http\Requests\API\ApiRequest;
class StoreArticleRequest extends ApiRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => 'required',
'content' => 'required',
'image' => 'required|mimes:jpg,jpeg,png,bmp|max:512',
'category' => 'required',
'slug' => 'required|unique:articles'
];
}
/**
* Throw Http Response Exception
*
* @param Validator $validator
* @return void
*/
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException($this->validatorResponse('failed', 422, $validator->errors()));
}
}
也许你们所有人都可以分享你关于这个问题的经验和解决方案。
最好的方法是什么?
我不需要使用Vuelidate并且只使用来自我的后端的错误响应吗?
解决方案
一般的最佳实践是在客户端和后端进行验证,但绝对是在后端。您的服务需要防止格式错误的数据被提交和持久化。
至于客户端,验证很好地提供即时反馈并防止对您的服务器的错误请求,这将花费更多时间并用可预防的 400 错误污染您的日志。理想情况下,一个框架可以作为双方的验证,有些框架可以。不确定你的组合。我选择在客户端使用 Vee-Validate 和 Vuetify,在 .NET 核心后端使用 FluentValidation,但规则是重复的。
推荐阅读
- r - 如何在 tbl_summary() 表中标记变量 *values*?
- python - 为什么命名参数适用于 np.reshape 而不是 x.reshape?
- sql-server - 如何根据列标题名称执行查找?
- c# - SQL Server 中日期的数据类型是什么?
- sql - 未能将窗口调用分解为组。至少 1 个组必须仅依赖于输入列
- python - 树莓派上的pydrive
- arrays - 将 label.textValue.last 与字符串数组进行比较
- swift - 在 XML 数据上创建 CMS 签名时崩溃
- firebase - 在 Firestore 中的不同字段上涉及 isGreaterThan 或 isLessThan 的多个查询
- python - 为划分为 bin 的数据绘制箱须图