Articole

Vue și Laravel: creați o aplicație cu o singură pagină

Laravel este unul dintre cele mai populare framework-uri PHP folosite de dezvoltatori, haideți să vedem astăzi cum să faceți o aplicație cu o singură pagină cu VueJs.

Înainte de lansarea Laravel UI, una dintre caracteristicile sale principale era pre-suportuldefinoapte pentru Vue.js de la Laravel v5.3 la v6. Vue este un cadru frontend JavaScript modern folosit pentru a construi interfețe cu utilizatorul.

De ce să instalați Laravel și Vue împreună?

Iată câteva dintre principalele beneficii ale utilizării Laravel cu Vue pentru a crea un flux de lucru complet pentru proiectele dvs.:

Codul sursă este combinat într-un singur proiect, în loc să aibă proiecte separate pentru backend și frontend
Instalarea și configurarea sunt simple
O singură distribuție poate gestiona ambele cadre împreună

Ce este un SPA? (aplicație pe o singură pagină)

o aplicație cu o singură pagină (SPA pe scurt) încarcă dinamic date noi de pe un server web într-o pagină web fără a fi nevoie să reîmprospăteze întreaga pagină.

Exemple de site-uri web populare care folosesc SPA-uri includ gmail.com și youtube.com – cu alte cuvinte, SPA-urile sunt în mare parte omniprezente. Majoritatea tablourilor de bord cu care ați putea lucra zilnic sunt create folosind SPA.

Avantajele SPA-urilor:

Experiența utilizatorului este mai flexibilă
Memorați datele în cache în browser
Timp de încărcare rapid


Dezavantajele SPA-urilor:

Poate compromite SEO (optimizarea pentru motoarele de căutare)
Potențiale probleme de securitate
Consumă o mulțime de resurse ale browserului

Configurarea proiectului în Laravel

Această postare va demonstra cum să dezvolte o aplicație de rezolvat care le permite utilizatorilor să se înregistreze pentru un cont și să adauge sarcini.

Pentru acest tutorial se folosește Laravel 9, care necesită PHP 8.1 și Vue 3; de asemenea, trebuie să avem instalate PHP și NGINX.

Începem cu următoarea comandă:

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

În continuare, vom instala dependențele JavaScript.

npm install

Trebuie să instalăm câteva pachete înainte de a putea adăuga Vue la proiectul nostru.

De asemenea, plugin-vue trebuie instalat, deoarece Laravel 9 este livrat cu Vite, mai degrabă decât webpack-mix, care a fost bundler-ul anterior Laravel pentru JavaScript. Hai sa o facem acum:

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

Deschideți fișierul numit vite.config.js si adauga vue() la configurare:

Buletin informativ de inovare
Nu rata cele mai importante știri despre inovație. Înscrieți-vă pentru a le primi pe e-mail.
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',
        ]),
    ],
});

Editați fișierul app.js și fragmentul de bootstrap pentru aplicația Vue 3:

require('./bootstrap');

import {createApp} from 'vue'

import App from './App.vue'

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

Creați un fișier numit App.vue și adăugați următoarele:

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

   }
}
</script>

În cele din urmă, deschideți fișierul welcome.blade.php aflat în folder resources/views și adăugați următoarele:

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

Pentru a previzualiza aplicația noastră, trebuie să pornim aplicația Vue și serverul Laravel pe două terminale/linii de comandă diferite:

npm run dev


php artisan serve

Pentru a crea aplicația noastră de făcut, trebuie să creăm alte fișiere. Vue va crea mai multe pagini, în principal:

  • de acces
  • pentru inregistrare
  • O pagină de pornire


Pentru a comunica cu punctele finale Laravel, trebuie să instalăm Axios:

npm install axios

rutare vue

Folosind pachetul vue-router, există diverse strategii de rutare care pot fi folosite în Vue; aceste strategii mai sunt cunoscute ca history models.

Când un utilizator solicită route cum ar fi http://localhost:8000/home, care va returna o eroare 404 atunci când pagina este reîmprospătată, ne putem baza pe Laravel pentru a detecta orice rute de rezervă și apoi a servi fișierul Blade care conține aplicația noastră.

Din acest motiv, vom folosi modul 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')
        }
    ],
})

În acest exemplu ne ocupăm de autentificare folosind Laravel Sanctum, apoi jetonul este salvat în stocarea locală.

Pentru ca alte cereri să reușească, token-ul este îmbinat în antet, ceea ce va permite utilizatorului care face cererea să fie identificat de Laravel.

Iată blocurile de cod asociate pentru ambele:

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

De asemenea poti fi interesat de ...

Buletin informativ de inovare
Nu rata cele mai importante știri despre inovație. Înscrieți-vă pentru a le primi pe e-mail.

Articole recente

Veeam oferă cel mai complet suport pentru ransomware, de la protecție la răspuns și recuperare

Coveware de la Veeam va continua să ofere servicii de răspuns la incidente de extorcare cibernetică. Coveware va oferi capacități criminalistice și de remediere...

Aprilie 23 2024

Revoluția verde și digitală: cum întreținerea predictivă transformă industria petrolului și gazelor

Întreținerea predictivă revoluționează sectorul petrolului și gazelor, cu o abordare inovatoare și proactivă a managementului uzinelor...

Aprilie 22 2024

Autoritatea de reglementare antitrust din Marea Britanie ridică alarma BigTech cu privire la GenAI

CMA din Marea Britanie a emis un avertisment cu privire la comportamentul Big Tech pe piața inteligenței artificiale. Acolo…

Aprilie 18 2024

Casa Green: revoluție energetică pentru un viitor durabil în Italia

Decretul „Case verzi”, formulat de Uniunea Europeană pentru creșterea eficienței energetice a clădirilor, și-a încheiat procesul legislativ cu...

Aprilie 18 2024