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 相关文章推荐
输出控制类
Oct 09 PHP
很实用的一个完整email发送程序
Oct 09 PHP
如何用phpmyadmin设置mysql数据库用户的权限
Jan 09 PHP
php弹出对话框实现重定向代码
Jan 23 PHP
小谈php正则提取图片地址
Mar 27 PHP
ThinkPHP实现ajax仿官网搜索功能实例
Dec 02 PHP
php缓冲输出实例分析
Jan 05 PHP
php使用array_search函数实现数组查找的方法
Jun 12 PHP
搭建基于Docker的PHP开发环境的详细教程
Jul 01 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
Laravel向公共模板赋值方法总结
Jun 25 PHP
PHP实现随机发扑克牌
Apr 22 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在线生成ico文件的代码
2007/10/09 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
如何使用Gitblog和Markdown建自己的博客
2015/07/31 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
用Javascript实现UTF8编码转换成gb2312编码
2006/12/22 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
2015/01/09 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
快速学习jQuery插件 Form表单插件使用方法
2015/12/01 Javascript
jquery实现鼠标悬浮停止轮播特效
2020/08/20 Javascript
设置点击文本框或图片弹出日历控件的实现代码
2016/05/12 Javascript
AngularJS优雅的自定义指令
2016/07/01 Javascript
五分钟搞懂Vuex实用知识(小结)
2019/08/12 Javascript
js面向对象之实现淘宝放大镜
2020/01/15 Javascript
微信小程序图片自适应实现解析
2020/01/21 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
vue中路由跳转不计入history的操作
2020/09/21 Javascript
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
Python中条件判断语句的简单使用方法
2015/08/21 Python
python设计模式大全
2016/06/27 Python
python感知机实现代码
2019/01/18 Python
Django 拆分model和view的实现方法
2019/08/16 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
详解如何修改python中字典的键和值
2020/09/29 Python
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
生物化工工艺专业应届生求职信
2013/10/08 职场文书
大课间活动制度
2014/01/18 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
靠谱的活动总结
2019/04/16 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
postgresql如何找到表中重复数据的行并删除
2023/05/08 MySQL