bienes

Creación de una aplicación CRUD con Laravel y Vue.js

En este tutorial vemos juntos cómo escribir el código de una aplicación CRUD de ejemplo, con Laravel y Vue.js.

La Aplicación de una sola página nos permitirá completar un ciclo de operaciones básicas sobre DB: crear, leer, actualizar y borrar con Vue.js , enrutadores Vue y Marco Laravel .

Hoy en día, los frameworks JS más populares son Angular JS y Vue JS. Angular JS y Vue JS son marcos JS muy fáciles de usar y más populares. Brinda administración de todo el proyecto o aplicación sin actualizar la página y una poderosa validación de jquery.

Vue viene preempaquetado con Laravel (junto con Mezcla de Laravel , una excelente herramienta de creación basada en paquete web ) y permite a los desarrolladores comenzar a crear aplicaciones complejas de una sola página sin preocuparse por los transpiladores, los paquetes de código, los mapas fuente u otros aspectos "sucios" del desarrollo frontend moderno.

Requisitos del servidor

Php xnumx

Laravel 8.x

MySQL

Instalar el proyecto Laravel

Primero, abra la Terminal y ejecute el siguiente comando para crear un nuevo proyecto de laravel:

composer create-project --prefer-dist laravel/laravel crud-spa

o, si instaló Laravel Installer como una dependencia global del compositor:

laravel new crud-spa

Configurar los detalles de la base de datos:

Después de la instalación, vaya al directorio raíz de su proyecto, abra el archivo .env y configure los detalles de la base de datos de la siguiente manera:

DB_CONNECTION=mysql 
DB_HOST=127.0.0.1 
DB_PORT=3306 
DB_DATABASE=<DATABASE NAME>
DB_USERNAME=<DATABASE USERNAME>
DB_PASSWORD=<DATABASE PASSWORD>

Instalar dependencias npm

Ejecute el siguiente comando para instalar las dependencias front-end:

npm install

Después de eso, instale vue ,  vue-enrutador  e vue-axios . Vue-axios se usará para llamar a la API de back-end de Laravel. Ejecute el siguiente comando en la terminal:

npm install vue vue-router vue-axios --save

Crear migración, modelo y controlador.

Cree una plantilla de categoría, una migración y un controlador. Ejecute el siguiente comando para eso:

php artisan make:model Category -mcr

-mcr  este tema creará el modelo, la migración y el controlador utilizando la síntesis de un solo comando.

Ahora, abra el archivo de migración de categoría desde bases de datos / migración y reemplaza el código en la función arriba() :

public function up()
{
    Schema::create('categories', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('title');
        $table->text('description');
        $table->timestamps();
    });
}

Migre la base de datos usando el siguiente comando:

php artisan migrate

Ahora, abre la plantilla Category.php desdeapp/Models  y edite el código en el archivo model Categoría.php:

<?php

namespace App\Models;

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

class Category extends Model {

   use HasFactory;

   protected $fillable = ['title','description'];

}

?>

A continuación, abra CategoríaController.php y agregue el código en los métodos indexar, almacenar, actualizar y eliminar de la siguiente manera:

<?php

namespace App\Http\Controllers;

use App\Models\Category;
use Illuminate\Http\Request;

class CategoryController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $categories = Category::all(['id','title','description']);
        return response()->json($categories);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $category = Category::create($request->post());
        return response()->json([
            'message'=>'Category Created Successfully!!',
            'category'=>$category
        ]);
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Category  $category
     * @return \Illuminate\Http\Response
     */
    public function show(Category $category)
    {
        return response()->json($category);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\Category  $category
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Category $category)
    {
        $category->fill($request->post())->save();
        return response()->json([
            'message'=>'Category Updated Successfully!!',
            'category'=>$category
        ]);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Models\Category  $category
     * @return \Illuminate\Http\Response
     */
    public function destroy(Category $category)
    {
        $category->delete();
        return response()->json([
            'message'=>'Category Deleted Successfully!!'
        ]);
    }
}

Defiterminar las Rutas en web.php

ahora defiterminalos routes en los archivos web.php e api.php . ir a la carpeta routes y abra el archivo web.php y api.php y actualice lo siguiente routes:

routes/web.php

Boletín de innovación
No te pierdas las noticias más importantes sobre innovación. Regístrese para recibirlos por correo electrónico.
<?php
 
Route::get('{any}', function () {
    return view('app');
})->where('any', '.*');

routes/api.php

<?php
 
Route::resource('category',App\Http\Controllers\CategoryController::class)->only(['index','store','show','update','destroy']);

Crear una aplicación Vue

En este paso, vaya al directorio recurso/vistas, crea el archivo aplicación.blade.php  y agregue el siguiente código a aplicación.blade.php:

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="csrf-token" value="{{ csrf_token() }}"/>
        <title>Laravel Vue CRUD App</title>
        <link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet" type="text/css">
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
        <link href="{{ mix('css/app.css') }}" type="text/css" rel="stylesheet"/>
    </head>
    <body>
        <div id="app">
        </div>
        <script src="{{ mix('js/app.js') }}" type="text/javascript"></script>
    </body>
</html>

Crear componente para la aplicación Vue

En este paso, vaya a la carpeta resource/js, crea la carpeta components  y crea los archivos de la siguiente manera:

  • View app
  • Welcome.vue
  • Category/List.vue
  • Category/Add.vue
  • Category/Edit.vue

aplicación.vue  es el archivo principal de nuestra aplicación Vue. Definosotros terminaremos vista del enrutador  en ese archivo. Todas las rutas aparecerán en el archivo. aplicación.vue  .

Archivo apri il Welcome.vue y actualice el siguiente código en ese archivo:

<template>
    <div class="container mt-5">
        <div class="col-12 text-center">
            <h1>Laravel Vuejs CRUD</h1>
        </div>
    </div>
</template>

Abra el archivo App.vue y actualice el código de la siguiente manera:

<template>
    <main>
        <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
            <div class="container-fluid">
                <router-link to="/" class="navbar-brand" href="#">Laravel Vue Crud App</router-link>
                <div class="collapse navbar-collapse">
                    <div class="navbar-nav">
                        <router-link exact-active-class="active" to="/" class="nav-item nav-link">Home</router-link>
                        <router-link exact-active-class="active" to="/category" class="nav-item nav-link">Category</router-link>
                    </div>
                </div>
            </div>
        </nav>
        <div class="container mt-5">
            <router-view></router-view>
        </div>
    </main>
</template>
 
<script>
    export default {}
</script>

Entonces, abre resource / js / components / category / List.vue  y agregue el siguiente código en el archivo:

<template>
    <div class="row">
        <div class="col-12 mb-2 text-end">
            <router-link :to='{name:"categoryAdd"}' class="btn btn-primary">Create</router-link>
        </div>
        <div class="col-12">
            <div class="card">
                <div class="card-header">
                    <h4>Category</h4>
                </div>
                <div class="card-body">
                    <div class="table-responsive">
                        <table class="table table-bordered">
                            <thead>
                                <tr>
                                    <th>ID</th>
                                    <th>Title</th>
                                    <th>Description</th>
                                    <th>Actions</th>
                                </tr>
                            </thead>
                            <tbody v-if="categories.length > 0">
                                <tr v-for="(category,key) in categories" :key="key">
                                    <td>{{ category.id }}</td>
                                    <td>{{ category.title }}</td>
                                    <td>{{ category.description }}</td>
                                    <td>
                                        <router-link :to='{name:"categoryEdit",params:{id:category.id}}' class="btn btn-success">Edit</router-link>
                                        <button type="button" @click="deleteCategory(category.id)" class="btn btn-danger">Delete</button>
                                    </td>
                                </tr>
                            </tbody>
                            <tbody v-else>
                                <tr>
                                    <td colspan="4" align="center">No Categories Found.</td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>

<script>
export default {
    name:"categories",
    data(){
        return {
            categories:[]
        }
    },
    mounted(){
        this.getCategories()
    },
    methods:{
        async getCategories(){
            await this.axios.get('/api/category').then(response=>{
                this.categories = response.data
            }).catch(error=>{
                console.log(error)
                this.categories = []
            })
        },
        deleteCategory(id){
            if(confirm("Are you sure to delete this category ?")){
                this.axios.delete(`/api/category/${id}`).then(response=>{
                    this.getCategories()
                }).catch(error=>{
                    console.log(error)
                })
            }
        }
    }
}
</script>

A continuación, abra  resource /js/components/category/Add.vue  y actualice el siguiente código en el archivo:

<template>
    <div class="row">
        <div class="col-12">
            <div class="card">
                <div class="card-header">
                    <h4>Add Category</h4>
                </div>
                <div class="card-body">
                    <form @submit.prevent="create">
                        <div class="row">
                            <div class="col-12 mb-2">
                                <div class="form-group">
                                    <label>Title</label>
                                    <input type="text" class="form-control" v-model="category.title">
                                </div>
                            </div>
                            <div class="col-12 mb-2">
                                <div class="form-group">
                                    <label>Description</label>
                                    <input type="text" class="form-control" v-model="category.description">
                                </div>
                            </div>
                            <div class="col-12">
                                <button type="submit" class="btn btn-primary">Save</button>
                            </div>
                        </div>                        
                    </form>
                </div>
            </div>
        </div>
    </div>
</template>

<script>
export default {
    name:"add-category",
    data(){
        return {
            category:{
                title:"",
                description:""
            }
        }
    },
    methods:{
        async create(){
            await this.axios.post('/api/category',this.category).then(response=>{
                this.$router.push({name:"categoryList"})
            }).catch(error=>{
                console.log(error)
            })
        }
    }
}
</script>

A continuación, abra  resource /js/components/category/Edit.vue  y actualice el siguiente código en el archivo:


<template>
    <div class="row">
        <div class="col-12">
            <div class="card">
                <div class="card-header">
                    <h4>Update Category</h4>
                </div>
                <div class="card-body">
                    <form @submit.prevent="update">
                        <div class="row">
                            <div class="col-12 mb-2">
                                <div class="form-group">
                                    <label>Title</label>
                                    <input type="text" class="form-control" v-model="category.title">
                                </div>
                            </div>
                            <div class="col-12 mb-2">
                                <div class="form-group">
                                    <label>Description</label>
                                    <input type="text" class="form-control" v-model="category.description">
                                </div>
                            </div>
                            <div class="col-12">
                                <button type="submit" class="btn btn-primary">Update</button>
                            </div>
                        </div>                        
                    </form>
                </div>
            </div>
        </div>
    </div>
</template>

<script>
export default {
    name:"update-category",
    data(){
        return {
            category:{
                title:"",
                description:"",
                _method:"patch"
            }
        }
    },
    mounted(){
        this.showCategory()
    },
    methods:{
        async showCategory(){
            await this.axios.get(`/api/category/${this.$route.params.id}`).then(response=>{
                const { title, description } = response.data
                this.category.title = title
                this.category.description = description
            }).catch(error=>{
                console.log(error)
            })
        },
        async update(){
            await this.axios.post(`/api/category/${this.$route.params.id}`,this.category).then(response=>{
                this.$router.push({name:"categoryList"})
            }).catch(error=>{
                console.log(error)
            })
        }
    }
}
</script>

DefiFinalice la ruta a la aplicación CRUD en Vue Router

Ahora, tienes que defiterminar el Vue routes, y para ello ve a la carpeta  resource / js , crea el archivo route.js  y actualice el siguiente código en el archivo:

const Welcome = () => import('./components/Welcome.vue' /* webpackChunkName: "resource/js/components/welcome" */)
const CategoryList = () => import('./components/category/List.vue' /* webpackChunkName: "resource/js/components/category/list" */)
const CategoryCreate = () => import('./components/category/Add.vue' /* webpackChunkName: "resource/js/components/category/add" */)
const CategoryEdit = () => import('./components/category/Edit.vue' /* webpackChunkName: "resource/js/components/category/edit" */)

export const routes = [
    {
        name: 'home',
        path: '/',
        component: Welcome
    },
    {
        name: 'categoryList',
        path: '/category',
        component: CategoryList
    },
    {
        name: 'categoryEdit',
        path: '/category/:id/edit',
        component: CategoryEdit
    },
    {
        name: 'categoryAdd',
        path: '/category/add',
        component: CategoryCreate
    }
]

Aquí hemos utilizado componentes carga lentavue JS gestiona la carga de componentes de una manera lazy con rutas, por lo que en el DOM puede cargar componentes solo cuando se necesitan a través de rutas.

Incluir dependencias de Vue.js en app.js

Ahora necesita agregar todas las rutas, vue-axios y otras dependencias.

resource / js / app.js

require('./bootstrap');
import vue from 'vue'
window.Vue = vue;

import App from './components/App.vue';
import VueRouter from 'vue-router';
import VueAxios from 'vue-axios';
import axios from 'axios';
import {routes} from './routes';
 
Vue.use(VueRouter);
Vue.use(VueAxios, axios);
 
const router = new VueRouter({
    mode: 'history',
    routes: routes
});
 
const app = new Vue({
    el: '#app',
    router: router,
    render: h => h(App),
});

Actualizar webpack.mix.js

paquete web.mix.js

const mix = require('laravel-mix');

/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel applications. By default, we are compiling the CSS
 | file for the application as well as bundling up all the JS files.
 |
 */

mix.js('resources/js/app.js', 'public/js')
    .postCss('resources/css/app.css', 'public/css', [
        //
    ]).vue();

Ejecutar el servidor de desarrollo

Abra la terminal y ejecute este comando:

npm run watch
php artisan serve

Abri servidor local: 8000 navegador web.

BlogInnovazione.it

Boletín de innovación
No te pierdas las noticias más importantes sobre innovación. Regístrese para recibirlos por correo electrónico.

Artículos recientes

El futuro está aquí: cómo la industria naviera está revolucionando la economía global

El sector naval es una auténtica potencia económica mundial, que ha navegado hacia un mercado de 150 mil millones...

1 2024 mayo

Editores y OpenAI firman acuerdos para regular el flujo de información procesada por la Inteligencia Artificial

El lunes pasado, el Financial Times anunció un acuerdo con OpenAI. FT otorga licencia para su periodismo de clase mundial...

Abril 30 2024

Pagos en línea: así es como los servicios de transmisión le hacen pagar para siempre

Millones de personas pagan por servicios de streaming pagando cuotas de suscripción mensuales. Es opinión común que usted…

Abril 29 2024

Veeam ofrece el soporte más completo para ransomware, desde protección hasta respuesta y recuperación.

Coveware by Veeam seguirá brindando servicios de respuesta a incidentes de extorsión cibernética. Coveware ofrecerá capacidades forenses y de remediación...

Abril 23 2024