3. Laravel 8 con auth ui y VUE.js 3 - Formularios

Más
1 año 6 meses antes - 1 año 5 meses antes #43 por luispindola
Este tema es continuación de: Laravel 8 con auth ui y VUE.js 3 - Vue-RouterLaravel 8 con auth ui y VUE.js 3 - Vue-Router

1. Primero vamos a crear la tabla y modelo Libros:
migrate:
cretate_libros_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateLibrosTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('libros', function (Blueprint $table) {
            $table->id();
            $table->string('titulo');
            $table->string('description');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('libros');
    }
}

app/Models/Libro.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Libro extends Model
{
    use HasFactory;

    protected $table = 'libros';
    protected $fillable = [
        'titulo',
        'descripcion',
    ];
}

yo corremos las migraciones para que se cree la tabla:
php artisan migrate

2. como vamos a trabajar con un controlador tipo Api, vamos a crear un Resorce:
tecleamos en consola:
php artisan make:resource LibroResource

y de momento el código quedaría:


3. creamos el Request teclando en consola:
php artisan make:request LibroRequest
y agregamos el siguiente código:
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class LibroRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'titulo'        =>  'required',
            'descripcion'   =>  'required'
        ];
    }
}

4. Creamos el controlador Api/LibrosController tecleando en consola:
php artisan make:controller Api/LibrosController
y agregamos el siguiente código:
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\LibroRequest;
use App\Http\Resources\LibroResource;
use App\Models\Libro;
use Illuminate\Http\Request;

class LibrosController extends Controller
{
    //
    public function storeLibro (LibroRequest $request)
    {
        $libro = Libro::create($request->validated());
        return new LibroResource($libro);
    }
}

5. Creamos el archivo:
App/resources/js/libros.js
import { ref } from 'vue'
import { useRouter } from 'vue-router'

export default function useLibros(){
	const errors = ref('')
	const router = useRouter()
	const libros = ref([])

	const storeLibro = async (data) => {
		console.log("Funcion para enviar data via  post por axios")

		errors.value = ''
		try{
			await axios.post('/api/libros/store',data) 
			await router.push({name: 'holamundo'})
		} catch(e){			
			if(e.response.status === 422){
				errors.value = e.response.data.errors
			}
		}
	} 

	return {
		libros,
		errors,
		storeLibro
	}
}

6. Por último modificamos el archivo CreaLibro.vue con lo siguiente:
<template>
	<div class="card">
    	        <div class="card-header">{{ tituloform }}</div>
		<div class="card-body">
			<div id="formulario-persona">

		 	<div v-if="errors"> 
        <div v-for="(v, k) in errors" :key="k">
          <p class="text-danger" v-for="error in v" :key="error">  
              {{ error }}
          </p>
        </div>
    	</div>

			<form @submit.prevent="onSubmit">
					<div class="form-group">
		              <label>Titulo</label>
		              <input type="text" v-model="form.titulo" class="form-control" />
		            </div>
		            <div class="form-group">
		              <label>Descripción</label>
		              <input type="text" v-model="form.descripcion" class="form-control" />
		            </div>


		            <div class="row">
			          <div class="col-md-4">
			            <div class="form-group">
			              <button type="submit" class="btn btn-primary" >Añadir libro</button>

			              
			            </div>
			          </div>
			        </div>
				</form>

			</div>
		</div>
	</div>
</template>

<script>
import { reactive } from 'vue';
import { ref } from 'vue';
import useLibros from "../libros.js";

export default {
	setup() {
		const {errors, storeLibro} = useLibros()

		const form = reactive({
			titulo: '',
			descripcion: ''
		})

		const tituloform = "Titulo de formulario"

		const onSubmit = async()=> {
			console.log("Recibida en funcion submit ("+form.titulo+")")
			await storeLibro({...form})
		}

		return {
			form,
			tituloform,
			onSubmit,
			errors
		}
	}
}	
</script>
<style scoped>
  form {
    margin-bottom: 2rem;
  }
</style>

7. Por último ejecutamos:
npm run dev

y al ejecutar el sitio nos debe mostrar funcional el formulario para crear nuevo:

De momento se puede verificar los datos guardados directamente en la base de datos, mas adelante publicaré como se consultan, editan y eliminan los registros para tener el CRUD completo.

8. Aquí comparto el link para descargar el proyecto laravel-vue como va hasta éste punto:

Parte del mensaje está oculto para usuarios no registrados. Por favor inicie sesión o regístrese para poder verlo.
Adjuntos:
Última Edición: 1 año 5 meses antes por luispindola.

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Tiempo de carga de la página: 0.099 segundos