Artikelen

Vue en Laravel: maak een Single Page Application

Laravel is een van de meest populaire PHP-frameworks die door ontwikkelaars worden gebruikt, laten we vandaag eens kijken hoe we een Single Page Application kunnen maken met VueJs.

Vóór de lancering van Laravel UI was pre-ondersteuning een van de belangrijkste kenmerkendefiavond voor Vue.js van Laravel v5.3 tot v6. Vue is een modern JavaScript frontend-framework dat wordt gebruikt om gebruikersinterfaces te bouwen.

Waarom Laravel en Vue samen installeren?

Hier zijn enkele van de belangrijkste voordelen van het gebruik van Laravel met Vue om een ​​volledige workflow voor uw projecten te creëren:

De broncode wordt gecombineerd in één project, in plaats van aparte projecten voor de backend en frontend
Installatie en configuratie zijn eenvoudig
Een enkele distributie kan beide frameworks samen beheren

Wat is een SPA? (toepassing van één pagina)

een toepassing van één pagina (afgekort SPA) laadt dynamisch nieuwe gegevens van een webserver in een webpagina zonder de hele pagina te hoeven vernieuwen.

Voorbeelden van populaire websites die SPA's gebruiken, zijn gmail.com en youtube.com - met andere woorden, SPA's zijn grotendeels alomtegenwoordig. De meeste beheerdashboards waarmee u dagelijks werkt, zijn gebouwd met behulp van SPA.

Voordelen van SPA's:

De gebruikerservaring is flexibeler
Cachegegevens in de browser
Snelle laadtijd


Nadelen van SPA's:

Kan SEO (zoekmachineoptimalisatie) in gevaar brengen
Mogelijke beveiligingsproblemen
Het verbruikt veel browserbronnen

Projectconfiguratie in Laravel

Dit bericht laat zien hoe je een taken-app kunt ontwikkelen waarmee gebruikers zich kunnen aanmelden voor een account en taken kunnen toevoegen.

Voor deze tutorial wordt Laravel 9 gebruikt, waarvoor PHP 8.1 en Vue 3 vereist zijn; we moeten ook PHP en NGINX geïnstalleerd hebben.

We beginnen met de volgende opdracht:

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

Vervolgens installeren we de JavaScript-afhankelijkheden.

npm install

We moeten enkele pakketten installeren voordat we Vue aan ons project kunnen toevoegen.

Ook moet plug-in-vue worden geïnstalleerd, aangezien Laravel 9 wordt geleverd met Vite, in plaats van webpack-mix, wat de vorige Laravel-bundel voor JavaScript was. Laten we het nu doen:

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

Open het bestand genaamd vite.config.js en voeg toe vue() naar configuratie:

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

Bewerk het app.js-bestand en het bootstrap-fragment voor de Vue 3-app:

require('./bootstrap');

import {createApp} from 'vue'

import App from './App.vue'

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

Maak een bestand aan met de naam App.vue en voeg het volgende toe:

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

   }
}
</script>

Open ten slotte het bestand welcome.blade.php bevindt zich in de map resources/views en voeg het volgende toe:

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

Om een ​​voorbeeld van onze app te bekijken, moeten we onze Vue-app en Laravel-server starten op twee verschillende terminals/opdrachtregels:

npm run dev


php artisan serve

Om onze taken-app te maken, moeten we andere bestanden maken. Vue zal meerdere pagina's maken, voornamelijk:

  • van toegang
  • voor registratie
  • Een homepage


Om te communiceren met Laravel-eindpunten, moeten we Axios installeren:

npm install axios

vue routering

Het pakket gebruiken vue-router, zijn er verschillende routeringsstrategieën die in Vue kunnen worden gebruikt; deze strategieën zijn ook bekend als history models.

Wanneer een gebruiker daarom vraagt route zoals http://localhost:8000/home, die een 404-fout zal retourneren wanneer de pagina wordt vernieuwd, kunnen we erop vertrouwen dat Laravel eventuele terugvalroutes detecteert en vervolgens het Blade-bestand levert dat onze app bevat.

Om deze reden gebruiken we de HTML5-modus:

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')
        }
    ],
})

In dit voorbeeld behandelen we authenticatie met behulp van Laravel-heiligdom, dan wordt het token opgeslagen in de lokale opslag.

Om andere verzoeken te laten slagen, wordt het token samengevoegd in de header, waardoor de gebruiker die het verzoek indient, kan worden geïdentificeerd door Laravel.

Hier zijn de bijbehorende codeblokken voor beide:

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

Mogelijk bent u ook geïnteresseerd in ...

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