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正则替换函数preg_replace和preg_replace_callback使用总结
Sep 22 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
Nov 29 PHP
简单谈谈php延迟静态绑定
Jan 26 PHP
PHP使用SOAP扩展实现WebService的方法
Apr 01 PHP
深入讲解PHP的对象注入(Object Injection)
Mar 01 PHP
thinkPHP实现签到功能的方法
Mar 15 PHP
PHP 中使用explode()函数切割字符串为数组的示例
May 06 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
Jun 12 PHP
php基于session锁防止阻塞请求的方法分析
Aug 07 PHP
PHP设计模式之单例模式定义与用法分析
Mar 26 PHP
Laravel 登录后清空COOKIE的操作方法
Oct 14 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 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获取网址的顶级域名函数代码
2012/09/24 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
php工具型代码之印章抠图
2018/07/18 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
基于jQuery的仿flash的广告轮播
2010/11/05 Javascript
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
JavaScript——DOM操作——Window.document对象详解
2016/07/14 Javascript
javaScript手机号码校验工具类PhoneUtils详解
2017/12/08 Javascript
Vue 实时监听窗口变化 windowresize的两种方法
2018/11/06 Javascript
vue项目中全局引入1个.scss文件的问题解决
2019/08/01 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
vue-openlayers实现地图坐标弹框效果
2020/09/24 Javascript
用python读写excel的方法
2014/11/18 Python
Python的迭代器和生成器
2015/07/29 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
python基础教程项目三之万能的XML
2018/04/02 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
python实现Pyecharts实现动态地图(Map、Geo)
2020/03/25 Python
Python Selenium截图功能实现代码
2020/04/26 Python
Pycharm中配置远程Docker运行环境的教程图解
2020/06/11 Python
PyQt5的QWebEngineView使用示例
2020/10/20 Python
python 实用工具状态机transitions
2020/11/21 Python
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
Linux的主要特性
2016/09/03 面试题
幼儿园毕业园长感言
2014/02/24 职场文书
职务任命书范本
2014/06/05 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
初中军训感言
2015/08/01 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript