Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作


Posted in PHP onJune 30, 2017

本教程基于Laravel 5.4

开始之前首先准备好开发环境,我们假设你已经安装好 Laravel,至于 Vue 的引入,请参考官方文档。

做好上述准备工作后就可以开始我们的开发了,本教程中我们将演示文章发布页面的表单 验证 。

首先在 routes/web.php 中新增两条路由规则:

Route::get('post/create', 'PostController@create');
Route::post('post/save', 'PostController@save');

然后在项目根目录下运行 Artisan 命令创建控制器 PostController :

php artisan make:controller PostController

在生成的控制器中新增两个方法用于处理路由请求:

public function create() {
  return view('post.create');
}
public function save(Request $request) {
  // 设置验证规则
  $this->validate($request, [
     'title' => 'required',
     'body' => 'required'
   ]);
}

接下来就要创建响应视图了,为了复用已有的样式风格和页面布局,我们先运行如下 Artisan 命令:

php artisan make:auth

这样我们就可以复用 Laravel 自带的认证功能页面布局了,创建视图文件 post/create.blade.php ,并编辑文件内容如下:

@extends('layouts.app')
@section('content')
  <div class="container">
    <!--创建成功显示消息-->
    <div class="alert alert-success" v-if="submitted">
      创建成功!
    </div>
    <!--页面提交之后阻止刷新-->
    <form @submit.prevent="createPost" method="POST">
      <legend>创建文章</legend>
      <!--如果title字段验证失败则添加.has-error-->
      <div class="form-group" :class="{'has-error':errors.title}">
        <label>文章标题</label>
        <input type="text" name="title" class="form-control" v-model="post.title" value="{{ old('title') }}">
        <!--如果验证失败通过FormError组件显示错误信息-->
        <form-error v-if="errors.title" :errors="errors">
          @{{errors.title.join(',')}}
        </form-error>
      </div>
      <!--如果body字段验证失败则添加.has-error-->
      <div class="form-group" :class="{'has-error':errors.body}">
        <label>文章正文</label>
        <textarea name="body" class="form-control" rows="5" v-model="post.body">{{ old('body') }}</textarea>
        <!--如果验证失败通过FormError组件显示错误信息-->
        <form-error v-if="errors.body" :errors="errors">
          @{{errors.body.join(',')}}
        </form-error>
      </div>
      <button type="submit" class="btn btn-primary">创建文章</button>
    </form>
  </div>
@endsection

这时访问页面页面为空,因为我们还没有定义 Vue 相关的数据变量, layouts.app 布局视图里引用了 app.js ,而这个 js 由 resources/assets/js/app.js 编译而来,所以我们准备在这里定义 Vue 相关的代码:

var app = new Vue({
  el: '#app',
  data: {
    post: {
      title: '',
      body: ''
    },
    errors: [],
    submitted: false
  },
  methods: {
    createPost: function () {
      var self = this;
      axios.post('/post/save', self.post).then(function(response) {
        // form submission successful, reset post data and set submitted to true
        self.post = {
          title: '',
          body: '',
        };
        // clear previous form errors
        self.errors = '';
        self.submitted = true;
      }).catch(function (error) {
        // form submission failed, pass form errors to errors array
        self.errors = error.response.data;
      });
    }
  }
});

我们在视图文件里还看到了 form-error ,这其实是 Vue 里面的子组件,我们可以在 resources/assets/js/components 目录下创建这个新的组件文件,该目录下提供了一个样例 Example.vue ,我们可以参照该样例编写一个新的 FormError.vue :

<template>
  <span class="help-block">
    <slot></slot>
  </span>
</template>
<script>
  export default {
    props: ['errors']
  }
</script>

这里我们将父组件中的数据 errors 传递到了子组件中以便在子组件中显示错误信息。完成创建子组件后不要忘了在上述 resources/assets/js/app.js 中引入它:

Vue.component('form-error', require('./components/FormError.vue'));

这样,我们就完成了所有编码工作,接下来运行以下命令重新编译js:

npm run dev

当然在开发环境中,我们更倾向于使用 npm run watch ,该命令会监听前端资源文件的更改然后重新编译,以避免每次修改后手动编译。

这样,在浏览器中访问 post/create 页面,就可以正常展示了:

Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作

什么都不填写,点击创建按钮,页面就能展示错误提示信息了:

Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作

填写相应字段之后再提交,则提示创建成功:

Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作

这样,我们在 Laravel 中完成了简单的,基于 Vue 实现的Ajax 表单提交验证功能,个人感觉在提升开发效率方面还是很显著的。

PHP 相关文章推荐
PHP 在线翻译函数代码
May 07 PHP
PHP模板引擎Smarty的缓存使用总结
Apr 24 PHP
php下载文件源代码(强制任意文件格式下载)
May 09 PHP
PHP解码unicode编码的中文字符代码分享
Aug 13 PHP
主流PHP框架的优缺点对比分析
Dec 25 PHP
PHP验证码生成原理和实现
Jan 24 PHP
非常实用的php验证码类
May 15 PHP
Yii安装与使用Excel扩展的方法
Jul 13 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
Oct 20 PHP
详解PHP 二维数组排序保持键名不变
Mar 06 PHP
PHP goto语句用法实例
Aug 06 PHP
php适配器模式简单应用示例
Oct 23 PHP
详解如何在云服务器上部署Laravel
Jun 30 #PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
Jun 30 #PHP
ThinkPHP实现登录退出功能
Jun 29 #PHP
PHP实现微信图片上传到服务器的方法示例
Jun 29 #PHP
PHP微信模板消息操作示例
Jun 29 #PHP
PHP开发的微信现金红包功能示例
Jun 29 #PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 #PHP
You might like
Zend引擎的发展 [15]
2006/10/09 PHP
php数组的一些常见操作汇总
2011/07/17 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
JavaScript错误处理
2015/02/03 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
用v-html解决Vue.js渲染中html标签不被解析的问题
2016/12/14 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
HTML5+JS+JQuery+ECharts实现异步加载问题
2017/12/16 jQuery
JS生成随机打乱数组的方法示例
2017/12/23 Javascript
详解vue的diff算法原理
2018/05/20 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
2018/12/03 Javascript
JS实现分页导航效果
2020/02/19 Javascript
python实现将元祖转换成数组的方法
2015/05/04 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
Django实现登录随机验证码的示例代码
2018/06/20 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
django解决订单并发问题【推荐】
2019/07/31 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
Python如何读写CSV文件
2020/08/13 Python
次世代生活态度:Hypebeast
2018/07/05 全球购物
俄罗斯有趣和原创礼物网上商店:MagicMag
2019/08/01 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
英语系毕业生求职信
2014/07/13 职场文书
客户答谢会活动方案
2014/08/31 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
复兴之路观后感3000字
2015/06/02 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
SQL Server 数据库实验课第五周——常用查询条件
2021/04/05 SQL Server