Laravel 中使用 Vue.js 實(shí)現(xiàn)基于 Ajax 的表單提交錯(cuò)誤驗(yàn)證操作
本教程基于Laravel 5.4
開始之前首先準(zhǔn)備好開發(fā)環(huán)境,我們假設(shè)你已經(jīng)安裝好 Laravel,至于 Vue 的引入,請(qǐng)參考官方文檔。
做好上述準(zhǔn)備工作后就可以開始我們的開發(fā)了,本教程中我們將演示文章發(fā)布頁(yè)面的表單 驗(yàn)證 。
首先在 routes/web.php 中新增兩條路由規(guī)則:
Route::get('post/create', 'PostController@create'); Route::post('post/save', 'PostController@save');
然后在項(xiàng)目根目錄下運(yùn)行 Artisan 命令創(chuàng)建控制器 PostController :
php artisan make:controller PostController
在生成的控制器中新增兩個(gè)方法用于處理路由請(qǐng)求:
public function create() { return view('post.create'); } public function save(Request $request) { // 設(shè)置驗(yàn)證規(guī)則 $this->validate($request, [ 'title' => 'required', 'body' => 'required' ]); }
接下來(lái)就要?jiǎng)?chuàng)建響應(yīng)視圖了,為了復(fù)用已有的樣式風(fēng)格和頁(yè)面布局,我們先運(yùn)行如下 Artisan 命令:
php artisan make:auth
這樣我們就可以復(fù)用 Laravel 自帶的認(rèn)證功能頁(yè)面布局了,創(chuàng)建視圖文件 post/create.blade.php ,并編輯文件內(nèi)容如下:
@extends('layouts.app') @section('content') <div class="container"> <!--創(chuàng)建成功顯示消息--> <div class="alert alert-success" v-if="submitted"> 創(chuàng)建成功! </div> <!--頁(yè)面提交之后阻止刷新--> <form @submit.prevent="createPost" method="POST"> <legend>創(chuàng)建文章</legend> <!--如果title字段驗(yàn)證失敗則添加.has-error--> <div class="form-group" :class="{'has-error':errors.title}"> <label>文章標(biāo)題</label> <input type="text" name="title" class="form-control" v-model="post.title" value="{{ old('title') }}"> <!--如果驗(yàn)證失敗通過(guò)FormError組件顯示錯(cuò)誤信息--> <form-error v-if="errors.title" :errors="errors"> @{{errors.title.join(',')}} </form-error> </div> <!--如果body字段驗(yàn)證失敗則添加.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> <!--如果驗(yàn)證失敗通過(guò)FormError組件顯示錯(cuò)誤信息--> <form-error v-if="errors.body" :errors="errors"> @{{errors.body.join(',')}} </form-error> </div> <button type="submit" class="btn btn-primary">創(chuàng)建文章</button> </form> </div> @endsection
這時(shí)訪問(wèn)頁(yè)面頁(yè)面為空,因?yàn)槲覀冞€沒(méi)有定義 Vue 相關(guān)的數(shù)據(jù)變量, layouts.app 布局視圖里引用了 app.js ,而這個(gè) js 由 resources/assets/js/app.js 編譯而來(lái),所以我們準(zhǔn)備在這里定義 Vue 相關(guān)的代碼:
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; }); } } });
我們?cè)谝晥D文件里還看到了 form-error ,這其實(shí)是 Vue 里面的子組件,我們可以在 resources/assets/js/components 目錄下創(chuàng)建這個(gè)新的組件文件,該目錄下提供了一個(gè)樣例 Example.vue ,我們可以參照該樣例編寫一個(gè)新的 FormError.vue :
<template> <span class="help-block"> <slot></slot> </span> </template> <script> export default { props: ['errors'] } </script>
這里我們將父組件中的數(shù)據(jù) errors 傳遞到了子組件中以便在子組件中顯示錯(cuò)誤信息。完成創(chuàng)建子組件后不要忘了在上述 resources/assets/js/app.js 中引入它:
Vue.component('form-error', require('./components/FormError.vue'));
這樣,我們就完成了所有編碼工作,接下來(lái)運(yùn)行以下命令重新編譯js:
npm run dev
當(dāng)然在開發(fā)環(huán)境中,我們更傾向于使用 npm run watch
,該命令會(huì)監(jiān)聽前端資源文件的更改然后重新編譯,以避免每次修改后手動(dòng)編譯。
這樣,在瀏覽器中訪問(wèn) post/create 頁(yè)面,就可以正常展示了:
什么都不填寫,點(diǎn)擊創(chuàng)建按鈕,頁(yè)面就能展示錯(cuò)誤提示信息了:
填寫相應(yīng)字段之后再提交,則提示創(chuàng)建成功:
這樣,我們?cè)?Laravel 中完成了簡(jiǎn)單的,基于 Vue 實(shí)現(xiàn)的Ajax 表單提交驗(yàn)證功能,個(gè)人感覺(jué)在提升開發(fā)效率方面還是很顯著的。
相關(guān)文章
發(fā)款php蜘蛛統(tǒng)計(jì)插件只要有mysql就可用
有時(shí)候我們?yōu)榱丝匆幌轮┲肱佬械那闆r,不得不對(duì)日志進(jìn)行大量的分析,由此想做一款插件可以記錄蜘蛛的情況。在第一次做的時(shí)候,只是記錄下蜘蛛的爬行次數(shù),不大好分析。2010-10-10PHP實(shí)現(xiàn)隨機(jī)生成水印圖片功能
這篇文章主要為大家詳細(xì)介紹了PHP生成隨機(jī)水印圖片的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Linux下手動(dòng)編譯安裝PHP擴(kuò)展的例子分享
這篇文章主要介紹了Linux下手動(dòng)編譯安裝PHP擴(kuò)展的例子分享,本文以PDO_MYSQL為例,講解手動(dòng)編譯安裝PHP擴(kuò)展的方法,需要的朋友可以參考下2014-07-07PHP中nowdoc和heredoc使用需要注意的一點(diǎn)
多次使用 php nowdoc HereDoc 插入大量Hmtl都沒(méi)有成功,一樣提示語(yǔ)法有問(wèn)題,事實(shí)上PHP手冊(cè)注明是這樣寫的,實(shí)在很奇怪2014-03-03php中session_id()函數(shù)詳細(xì)介紹,會(huì)話id生成過(guò)程及session id長(zhǎng)度
這篇文章主要介紹了php中session_id()函數(shù)詳細(xì)介紹,會(huì)話id生成過(guò)程及session id長(zhǎng)度的相關(guān)資料,需要的朋友可以參考下2015-09-09PHP中__get()和__set()的用法實(shí)例詳解
在PHP5中,預(yù)定義了兩個(gè)函數(shù)“__get()”和“__set()”來(lái)獲取和賦值其屬性,對(duì)每個(gè)字段進(jìn)行set和get的操作。只需要加上兩個(gè)魔術(shù)方法即可2013-06-06