Easily Handle Laravel-Vue Forms and Validation with Vform

Easily Handle Laravel-Vue Forms and Validation with Vform cover image

vform is a tiny library for Vue 2 & Vue 3 to assist with forms and validation when utilizing Laravel as a back-end. It renders a form instance to wrap your data conveniently and send it to your Laravel application via an HTTP request using Axios.

Installation

npm install axios vform

Basic Usage

After the installation, you can utilize this package.

<template>
<form @submit.prevent="login" @keydown="form.onKeydown($event)">
  <input v-model="form.username" type="text" name="username" placeholder="Username">
  <div v-if="form.errors.has('username')" v-html="form.errors.get('username')" />

  <input v-model="form.password" type="password" name="password" placeholder="Password">
  <div v-if="form.errors.has('password')" v-html="form.errors.get('password')" />

  <button type="submit" :disabled="form.busy">
    Log In
  </button>
</form>
</template>
<script>
import Form from 'vform'

export default {
  data: () => ({
    form: new Form({
      username: '',
      password: ''
    })
  }),

  methods: {
    async login () {
      const response = await this.form.post('/api/login')
      // ...
    }
  }
}
</script>

Laravel Controller:

<?php

class LoginController extends Controller
{
    public function login(Request $request)
    {
        $this->validate($request, [
            'username' => 'required',
            'password' => 'required',
        ]);

        // ...
    }
}

Components

vform includes a few components for Bootstrap and Tailwind to display the validation errors your Laravel application.

import {
  Button,
  HasError,
  AlertError,
  AlertErrors,
  AlertSuccess
} from 'vform/src/components/bootstrap5'
// 'vform/src/components/bootstrap4'
// 'vform/src/components/tailwind'

Vue.component(Button.name, Button)
Vue.component(HasError.name, HasError)
Vue.component(AlertError.name, AlertError)
Vue.component(AlertErrors.name, AlertErrors)
Vue.component(AlertSuccess.name, AlertSuccess)

HasError

Display the validation error for a field.

<HasError :form="form" field="username" />

AlertError

Show a danger alert if there are any validation errors.

<AlertError :form="form" message="There were some problems with your input." />
<!-- or -->
<AlertError :form="form">There were some problems with your input.</AlertError>

AlertErrors

Show a danger alert with the list of validation errors for each field.

<AlertErrors :form="form" message="There were some problems with your input." />
<!-- or -->
<AlertErrors :form="form">There were some problems with your input.</AlertErrors>

AlertSuccess

Show a success alert on a successful request.

<AlertSuccess :form="form" message="Your changes have been saved!" />
<!-- or -->
<AlertSuccess :form="form">Your changes have been saved!</AlertSuccess>

Button

A submit button with a spinner.

<Button :form="form">Submit</Button>

Examples

File Upload

<template>
<form @submit.prevent="submit" @keydown="form.onKeydown($event)">
  <input v-model="form.name" type="text" name="name">
  <HasError :form="form" field="name" />

  <input type="file" name="file" @change="handleFile">
  <HasError :form="form" field="file" />

  <div v-if="form.progress">Progress: {{ form.progress.percentage }}%</div>

  <button type="submit">Submit</button>
</form>
</template>

<script>
import Form from 'vform'
import { HasError } from 'vform/src/components/bootstrap5'

export default {
  components: { HasError },

  data: () => ({
    form: Form.make({
      name: '',
      file: null
    })
  }),

  methods: {
    handleFile (event) {
      // We'll grab just the first file...
      // You can also do some client side validation here.
      const file = event.target.files[0]

      // Set the file object onto the form...
      this.form.file = file
    },

    async submit () {
      const response = await this.form.post('/upload', {
        // onUploadProgress: e => console.log(e) }
      })

      // ...
    }
  }
}
</script>

For more details, You can visit its documentation and source code on Github.

Written by

Rizwan Aslam

Founder and CEO of CodeBrisk, with years of experience building web applications with Laravel and leading a team of expert developers.

More about Rizwan
Book a free call
Book a call with CodeBrisk