Artikelen

Een CRUD-app maken met Laravel en Vue.js

In deze tutorial zien we samen hoe je de code schrijft van een voorbeeld CRUD App, met Laravel en Vue.js.

La Toepassing op één pagina stelt ons in staat een cyclus van basisbewerkingen op DB te voltooien: maken, lezen, bijwerken en verwijderen met Vue.js , Vue-routers en Laravel-framework .

Tegenwoordig zijn de meest populaire JS-frameworks Angular JS en Vue JS. Angular JS en Vue JS zijn zeer gebruiksvriendelijke en populairste JS-frameworks. Het biedt beheer van het hele project of de hele applicatie zonder de pagina te vernieuwen en krachtige jQuery-validatie.

Vue wordt voorverpakt geleverd met Laravel (samen met Laravel-mix , een uitstekende authoringtool gebaseerd op webpack ) en stelt ontwikkelaars in staat om complexe applicaties met één pagina te bouwen zonder zich zorgen te hoeven maken over transpilers, codepakketten, bronkaarten of andere "vuile" aspecten van moderne frontend-ontwikkeling.

Serververeisten

Php 7.4

Laravel 8.x

MySQL

Installeer het Laravel-project

Open eerst Terminal en voer de volgende opdracht uit om een ​​nieuw laravel-project te maken:

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

of, als u Laravel Installer hebt geïnstalleerd als een globale afhankelijkheid van een componist:

laravel new crud-spa

Databasedetails configureren:

Na installatie Ga naar de hoofdmap van uw project, open het .env-bestand en stel de databasedetails als volgt in:

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

Installeer npm-afhankelijkheden

Voer de volgende opdracht uit om de front-end-afhankelijkheden te installeren:

npm install

Installeer daarna uitzicht ,  vue-router  e vue-axios . Vue-axios zal worden gebruikt om de Laravel-backend-API aan te roepen. Voer de volgende opdracht uit op de terminal:

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

Migratie, model en controller maken

Maak een categoriesjabloon, migratie en controller. Voer daarvoor de volgende opdracht uit:

php artisan make:model Category -mcr

-mcr  in dit onderwerp worden Model, Migratie en Controller gemaakt met behulp van synthese van één opdracht.

Open nu het categoriemigratiebestand van databases / migratie en vervang de code in de functie omhoog() :

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

Migreer de database met de volgende opdracht:

php artisan migrate

Open nu de Category.php-sjabloon vanapp/Models  en bewerk de code in het bestand model Categorie.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'];

}

?>

Daarna openen CategorieController.php en voeg de code als volgt toe aan de index-, opslag-, update- en verwijderingsmethoden:

<?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!!'
        ]);
    }
}

Defivoltooi de routes in web.php

Nu defimaak ze af routes in de bestanden web.php e api.php . Ga naar map routes en open het bestand web.php en api.php en werk het volgende bij routes:

routes/web.php

Innovatie nieuwsbrief
Mis het belangrijkste nieuws over innovatie niet. Meld u aan om ze per e-mail te ontvangen.
<?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']);

Maak een Vue-app

Ga in deze stap naar de directory bron/weergaven, maak het bestand aan app.blade.php  en voeg de volgende code toe aan app.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>

Maak een component voor de Vue-app

Ga in deze stap naar de map resource/js, maak de map aan components  en maak de bestanden als volgt aan:

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

app.weergave  het is het hoofdbestand van onze Vue-app. Defiwe zullen eindigen router-weergave  in dat bestand. Alle paden verschijnen in het bestand app.weergave  .

Apri il-bestand Welcome.vue en update de volgende code in dat bestand:

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

Open het App.vue-bestand en werk de code als volgt bij:

<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>

Open dan resource / js / components / category / List.vue  en voeg de volgende code toe aan het bestand:

<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>

Daarna openen  resource /js/components/category/Add.vue  en update de volgende code in het bestand:

<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>

Daarna openen  resource /js/components/category/Edit.vue  en update de volgende code in het bestand:


<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>

DefiVoltooi het pad naar de CRUD-app in Vue Router

Nu moet je defibeëindig de Vue routes, en ga hiervoor naar de map  resource / js , maak het bestand aan route.js  en update de volgende code in het bestand:

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
    }
]

Hier hebben we componenten gebruikt langzaam ladenvue js beheert het laden van componenten op een bepaalde manier lazy met paden, dus op de DOM kunt u alleen componenten laden wanneer ze nodig zijn via paden.

Neem Vue.js-afhankelijkheden op in app.js

Nu moet je alle paden, vue-axios en andere afhankelijkheden toevoegen.

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),
});

Werk webpack.mix.js bij

webpack.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();

Voer de ontwikkelingsserver uit

Open terminal en voer deze opdracht uit:

npm run watch
php artisan serve

Apri localhost:8000 in de browser.

BlogInnovazione.it

Innovatie nieuwsbrief
Mis het belangrijkste nieuws over innovatie niet. Meld u aan om ze per e-mail te ontvangen.

Recente artikelen

De toekomst is hier: hoe de scheepvaartindustrie een revolutie teweegbrengt in de wereldeconomie

De marinesector is een echte mondiale economische macht, die is genavigeerd naar een markt van 150 miljard...

1 mei 2024

Uitgevers en OpenAI ondertekenen overeenkomsten om de informatiestroom die door kunstmatige intelligentie wordt verwerkt, te reguleren

Afgelopen maandag maakte de Financial Times een deal met OpenAI bekend. FT geeft licenties voor haar journalistiek van wereldklasse...

April 30 2024

Online betalingen: hier is hoe streamingdiensten u voor altijd laten betalen

Miljoenen mensen betalen voor streamingdiensten en betalen maandelijkse abonnementskosten. De algemene mening is dat je…

April 29 2024

Veeam biedt de meest uitgebreide ondersteuning voor ransomware, van bescherming tot respons en herstel

Coveware by Veeam zal responsdiensten op het gebied van cyberafpersingsincidenten blijven leveren. Coveware zal forensische en herstelmogelijkheden bieden...

April 23 2024