Artikel

Membuat Aplikasi CRUD dengan Laravel dan Vue.js

Dalam tutorial ini kita melihat bersama bagaimana menulis kode aplikasi CRUD contoh, dengan Laravel dan Vue.js.

La Aplikasi Halaman Tunggal akan memungkinkan kami menyelesaikan siklus operasi dasar pada DB: buat, baca, perbarui, dan hapus dengan Vue.js , Vue Router dan Kerangka Laravel .

Framework JS yang paling populer saat ini adalah Angular JS dan Vue JS. Angular JS dan Vue JS adalah framework JS yang sangat ramah pengguna dan paling populer. Ini memberikan pengelolaan seluruh proyek atau aplikasi tanpa menyegarkan halaman dan validasi jquery yang kuat.

Vue sudah dikemas sebelumnya dengan Laravel (bersama dengan Campuran Laravel , alat pembuat yang luar biasa berdasarkan paket web ) dan memungkinkan pengembang untuk mulai membangun aplikasi satu halaman yang kompleks tanpa mengkhawatirkan transpiler, paket kode, peta sumber, atau aspek "kotor" lainnya dari pengembangan frontend modern.

Persyaratan server

Php 7.4

Laravel 8.x

MySQL

Instal proyek Laravel

Pertama, buka Terminal dan jalankan perintah berikut untuk membuat proyek laravel baru:

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

atau, jika Anda menginstal Laravel Installer sebagai ketergantungan global komposer:

laravel new crud-spa

Konfigurasikan detail basis data:

Setelah instalasi Buka direktori root proyek Anda, buka file .env dan atur detail database sebagai berikut:

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

Instal dependensi npm

Jalankan perintah berikut untuk menginstal dependensi front-end:

npm install

Setelah itu, instal pandangan ,  vue-router  e vue-aksios . Vue-axios akan digunakan untuk memanggil API backend Laravel. Jalankan perintah berikut di terminal:

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

Buat migrasi, model, dan pengontrol

Buat template kategori, migrasi, dan pengontrol. Jalankan perintah berikut untuk itu:

php artisan make:model Category -mcr

-mcr  topik ini akan membuat Model, Migrasi, dan Pengontrol menggunakan sintesis perintah tunggal.

Sekarang, buka file migrasi kategori dari database / migrasi dan ganti kode ke dalam fungsi ke atas() :

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

Migrasikan database menggunakan perintah berikut:

php artisan migrate

Sekarang, buka template Category.php dariapp/Models  dan edit kode dalam file model Kategori.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'];

}

?>

Setelah itu, buka KategoriController.php dan tambahkan kode dalam metode indeks, simpan, perbarui dan hapus sebagai berikut:

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

Defiselesaikan Rute di web.php

Ora defiselesaikan mereka routes dalam file web.php e api.php . Pergi ke folder routes dan buka file web.php dan api.php dan perbarui yang berikut ini routes:

routes/web.php

Buletin inovasi
Jangan lewatkan berita terpenting tentang inovasi. Daftar untuk menerimanya melalui email.
<?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']);

Buat aplikasi Vue

Pada langkah ini, buka direktori sumber daya/tampilan, buat file app.blade.php  dan tambahkan kode berikut ke 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>

Buat komponen untuk aplikasi Vue

Pada langkah ini, buka folder resource/js, buat foldernya components  dan buat file sebagai berikut:

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

app.vue  itu adalah file utama aplikasi Vue kami. Defikita akan selesai tampilan router  dalam berkas itu. Semua jalur akan muncul di file app.vue  .

Buka file Welcome.vue dan perbarui kode berikut dalam file itu:

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

Buka file App.vue dan perbarui kode sebagai berikut:

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

Lalu, buka resource / js / components / category / List.vue  dan tambahkan kode berikut di file:

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

Setelah itu, buka  resource /js/components/category/Add.vue  dan perbarui kode berikut dalam file:

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

Setelah itu, buka  resource /js/components/category/Edit.vue  dan perbarui kode berikut dalam file:


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

DefiSelesaikan jalur ke aplikasi CRUD di Vue Router

Sekarang, Anda harus defimenyelesaikan Vue routes, dan untuk melakukan ini buka folder  resource / js , buat file route.js  dan perbarui kode berikut dalam file:

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

Di sini kita telah menggunakan komponen pemuatan lambatvue js mengelola pemuatan komponen dengan cara tertentu lazy dengan jalur, jadi pada DOM Anda dapat memuat komponen hanya jika diperlukan melalui jalur.

Sertakan dependensi Vue.js di app.js

Sekarang Anda perlu menambahkan semua jalur, vue-axios, dan dependensi lainnya.

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

Perbarui webpack.mix.js

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

Jalankan server pengembangan

Buka terminal dan jalankan perintah ini:

npm run watch
php artisan serve

April host lokal: 8000 di peramban.

BlogInnovazione.it

Buletin inovasi
Jangan lewatkan berita terpenting tentang inovasi. Daftar untuk menerimanya melalui email.

Artikel Terbaru

Veeam menghadirkan dukungan paling komprehensif untuk ransomware, mulai dari perlindungan hingga respons dan pemulihan

Coveware by Veeam akan terus menyediakan layanan respons insiden pemerasan siber. Coveware akan menawarkan kemampuan forensik dan remediasi…

April 23 2024

Revolusi Hijau dan Digital: Bagaimana Pemeliharaan Prediktif Mengubah Industri Minyak & Gas

Pemeliharaan prediktif merevolusi sektor minyak & gas, dengan pendekatan inovatif dan proaktif terhadap manajemen pembangkit listrik.…

April 22 2024

Regulator antimonopoli Inggris meningkatkan kekhawatiran BigTech atas GenAI

CMA Inggris telah mengeluarkan peringatan tentang perilaku Big Tech di pasar kecerdasan buatan. Di sana…

April 18 2024

Casa Green: revolusi energi untuk masa depan berkelanjutan di Italia

Keputusan "Rumah Hijau", yang dirumuskan oleh Uni Eropa untuk meningkatkan efisiensi energi bangunan, telah mengakhiri proses legislatifnya dengan…

April 18 2024