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中其实也可以用方法链
Nov 10 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
Dec 05 PHP
解决PHP超大文件下载,断点续传下载的方法详解
Jun 06 PHP
完善CodeIgniter在IDE中代码提示功能的方法
Jul 19 PHP
zend framework框架中url大小写问题解决方法
Aug 19 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
PHP生成不重复标识符的方法
Nov 21 PHP
php去掉文件前几行的方法
Jul 29 PHP
PHP 实现浏览记录并按日期分组
May 11 PHP
laravel框架实现敏感词汇过滤功能示例
Feb 15 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 PHP
php + ajax 实现的写入数据库操作简单示例
May 16 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
PHP+JS无限级可伸缩菜单详解(简单易懂)
2007/01/02 PHP
使用Sphinx对索引进行搜索
2013/06/25 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
php使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
Yii2中事务的使用实例代码详解
2016/09/07 PHP
一个基于jquery的文本框记数器
2012/09/19 Javascript
jQuery中读取json文件示例代码
2013/05/10 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
jQuery事件绑定on()、bind()与delegate() 方法详解
2015/06/03 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
JS实现超简单的鼠标拖动效果
2015/11/02 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
2015/12/03 Javascript
JavaScript中的时间处理小结
2016/02/24 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
利用jquery实现瀑布流3种案例
2016/09/18 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
vue引入axios同源跨域问题
2018/09/27 Javascript
JS调用安卓手机摄像头扫描二维码
2018/10/16 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
微信小程序实现点击卡片 翻转效果
2019/09/04 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
2021/03/01 Vue.js
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
用Python实现读写锁的示例代码
2018/11/05 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
公司节能减排倡议书
2014/05/14 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
店长岗位职责
2015/02/11 职场文书
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers
Vue项目打包、合并及压缩优化网页响应速度
2021/07/07 Vue.js
Mysql事务索引知识汇总
2022/03/17 MySQL