artikel

Vue dan Laravel: buat Aplikasi Halaman Tunggal

Laravel ialah salah satu rangka kerja PHP paling popular yang digunakan oleh pembangun, mari lihat hari ini cara membuat Aplikasi Halaman Tunggal dengan VueJs.

Sebelum pelancaran Laravel UI, salah satu ciri utamanya ialah pra sokongandefimalam untuk Vue.js daripada Laravel v5.3 hingga v6. Vue ialah rangka kerja bahagian hadapan JavaScript moden yang digunakan untuk membina antara muka pengguna.

Mengapa memasang Laravel dan Vue bersama-sama?

Berikut ialah beberapa faedah utama menggunakan Laravel dengan Vue untuk mencipta aliran kerja yang lengkap untuk projek anda:

Kod sumber digabungkan menjadi satu projek, bukannya mempunyai projek berasingan untuk bahagian belakang dan bahagian hadapan
Pemasangan dan konfigurasi adalah mudah
Pengedaran tunggal boleh mengurus kedua-dua rangka kerja bersama-sama

Apa itu SPA? (permohonan satu halaman)

yang aplikasi satu halaman (Pendek kata SPA) memuatkan data baharu secara dinamik daripada pelayan web ke halaman web tanpa perlu memuat semula keseluruhan halaman.

Contoh tapak web popular yang menggunakan SPA termasuk gmail.com dan youtube.com – dengan kata lain, SPA banyak terdapat di mana-mana. Kebanyakan papan pemuka pentadbir yang mungkin anda gunakan setiap hari dibina menggunakan SPA.

Kelebihan SPA:

Pengalaman pengguna lebih fleksibel
Cache data dalam penyemak imbas
Masa memuatkan cepat


Kelemahan SPA:

Boleh menjejaskan SEO (pengoptimuman enjin carian)
Isu keselamatan yang berpotensi
Ia menggunakan banyak sumber pelayar

Konfigurasi projek dalam Laravel

Siaran ini akan menunjukkan cara membangunkan apl tugasan yang membolehkan pengguna mendaftar untuk akaun dan menambah tugasan.

Untuk tutorial ini, Laravel 9 digunakan, yang memerlukan PHP 8.1 dan Vue 3; kita juga perlu memasang PHP dan NGINX.

Kita mulakan dengan arahan berikut:

composer create-project --prefer-dist laravel/laravel laravel-vue-combo

Seterusnya, kami akan memasang kebergantungan JavaScript.

npm install

Kami perlu memasang beberapa pakej sebelum kami boleh menambah Vue pada projek kami.

Selain itu, plugin-vue mesti dipasang, kerana Laravel 9 dihantar dengan Vite, bukannya webpack-mix, yang merupakan pengikat Laravel sebelumnya untuk JavaScript. Jom buat sekarang:

npm install vue@next vue-loader@next @vitejs/plugin-vue

Buka fail yang dipanggil vite.config.js dan tambah vue() kepada konfigurasi:

Surat berita inovasi
Jangan terlepas berita paling penting tentang inovasi. Daftar untuk menerimanya melalui e-mel.
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import vue from '@vitejs/plugin-vue'

export default defineConfig({
    plugins: [
        vue(),
        laravel([
            'resources/css/app.css',
            'resources/js/app.js',
        ]),
    ],
});

Edit fail app.js dan coretan bootstrap untuk apl Vue 3:

require('./bootstrap');

import {createApp} from 'vue'

import App from './App.vue'

createApp(App).mount("#app")

Buat fail dipanggil App.vue dan tambah yang berikut:

<template>
  <h1> Hello, Vuejs with Laravel </h1>
</template>
<script>
export default {
  setup() {

   }
}
</script>

Akhirnya, buka fail welcome.blade.php terdapat dalam folder resources/views dan tambah yang berikut:

<!DOCTYPE html>
<html>
<head>
 ....
        @vite('resources/css/app.css')
</head>
<body>
  <div id="app"></div>
  @vite('resources/js/app.js')
</body>
</html>

Untuk pratonton apl kami, kami perlu memulakan apl Vue dan pelayan Laravel kami pada dua terminal/baris arahan yang berbeza:

npm run dev


php artisan serve

Untuk membuat apl tugasan kami, kami perlu membuat fail lain. Vue akan membuat berbilang halaman, terutamanya:

  • daripada akses
  • untuk pendaftaran
  • Sebuah halaman rumah


Untuk berkomunikasi dengan titik akhir Laravel, kami perlu memasang Axios:

npm install axios

penghalaan vue

Menggunakan pakej vue-router, terdapat pelbagai strategi penghalaan yang boleh digunakan dalam Vue; strategi ini juga dikenali sebagai history models.

Apabila pengguna meminta route seperti http://localhost:8000/home, yang akan mengembalikan ralat 404 apabila halaman dimuat semula, kami boleh bergantung pada Laravel untuk mengesan sebarang laluan sandaran dan kemudian menyampaikan fail Blade yang mengandungi apl kami.

Atas sebab ini, kami akan menggunakan mod HTML5:

Route::get('/{vue_capture?}', function() {
    return view('welcome');
})->where('vue_capture', '[\/\w\.-]*');
import {createRouter, createWebHistory} from 'vue-router';

const router = createRouter({
    history: createWebHistory(),
    routes: [
        {
            path: '/',
            component: () => import('./pages/Login.vue')
        },
        {
            path: '/register',
            component: () => import('./pages/Register.vue')
        },
        {
            path: '/home',
            component: () => import('./pages/Home.vue')
        }
    ],
})

Dalam contoh ini kami mengendalikan pengesahan menggunakan Laravel Sanctum, maka token disimpan dalam storan tempatan.

Untuk permintaan lain berjaya, token digabungkan ke dalam pengepala, yang akan membolehkan pengguna membuat permintaan untuk dikenal pasti oleh Laravel.

Berikut ialah blok kod yang berkaitan untuk kedua-duanya:

<!--Login.vue-->
<template>
    <div class="mx-auto w-4/12 mt-10 bg-blue-200 p-4 rounded-lg">
        <div
            class="bg-white shadow-lg rounded-lg px-8 pt-6 pb-8 mb-2 flex flex-col"
        >
            <h1 class="text-gray-600 py-5 font-bold text-3xl"> Login </h1>
            <ul class="list-disc text-red-400" v-for="(value, index) in errors" :key="index" v-if="typeof errors === 'object'">
                <li>{{value[0]}}</li>
            </ul>
            <p class="list-disc text-red-400" v-if="typeof errors === 'string'">{{errors}}</p>
            <form method="post" @submit.prevent="handleLogin">
            <div class="mb-4">
                <label
                    class="block text-grey-darker text-sm font-bold mb-2"
                    for="username"
                >
                    Email Address
                </label>
                <input
                    class="shadow appearance-none border rounded w-full py-2 px-3 text-grey-darker"
                    id="username"
                    type="text"
                    v-model="form.email"
                    required
                />
            </div>
            <div class="mb-4">
                <label
                    class="block text-grey-darker text-sm font-bold mb-2"
                    for="password"
                >
                    Password
                </label>
                <input
                    class="shadow appearance-none border border-red rounded w-full py-2 px-3 text-grey-darker mb-3"
                    id="password"
                    type="password"
                    v-model="form.password"
                    required
                />
            </div>
            <div class="flex items-center justify-between">
                <button
                    class="bg-blue-500 hover:bg-blue-900 text-white font-bold py-2 px-4 rounded"
                    type="submit"
                >
                    Sign In
                </button>
                <router-link
                    class="inline-block align-baseline font-bold text-sm text-blue hover:text-blue-darker"
                    to="register"
                >
                    Sign Up
                </router-link>
            </div>
            </form>
        </div>
    </div>
</template>
export default {
    setup() {
        const errors = ref()
        const router = useRouter();
        const form = reactive({
            email: '',
            password: '',
        })
        const handleLogin = async () => {
            try {
                const result = await axios.post('/api/auth/login', form)
                if (result.status === 200 && result.data && result.data.token) {
                    localStorage.setItem('APP_DEMO_USER_TOKEN', result.data.token)
                    await router.push('home')
                }
            } catch (e) {
                if(e && e.response.data && e.response.data.errors) {
                    errors.value = Object.values(e.response.data.errors)
                } else {
                    errors.value = e.response.data.message || ""
                }
            }
        }

        return {
            form,
            errors,
            handleLogin,
        }
    }
}

Ercole Palmeri

Anda mungkin juga berminat dengan ...

Surat berita inovasi
Jangan terlepas berita paling penting tentang inovasi. Daftar untuk menerimanya melalui e-mel.

Artikel baru-baru ini

Masa Depan Di Sini: Bagaimana Industri Perkapalan Merevolusikan Ekonomi Global

Sektor tentera laut adalah kuasa ekonomi global yang sebenar, yang telah menavigasi ke arah pasaran 150 bilion...

1 Mei 2024

Penerbit dan OpenAI menandatangani perjanjian untuk mengawal selia aliran maklumat yang diproses oleh Kepintaran Buatan

Isnin lalu, Financial Times mengumumkan perjanjian dengan OpenAI. FT melesenkan kewartawanannya bertaraf dunia…

30 April 2024

Pembayaran Dalam Talian: Begini Cara Perkhidmatan Penstriman Membuat Anda Membayar Selama-lamanya

Berjuta-juta orang membayar untuk perkhidmatan penstriman, membayar yuran langganan bulanan. Adalah menjadi pendapat umum bahawa anda…

29 April 2024

Veeam menampilkan sokongan paling komprehensif untuk perisian tebusan, daripada perlindungan kepada tindak balas dan pemulihan

Coveware oleh Veeam akan terus menyediakan perkhidmatan tindak balas insiden pemerasan siber. Coveware akan menawarkan keupayaan forensik dan pemulihan…

23 April 2024