Artikoli

Vue u Laravel: oħloq Applikazzjoni għal Paġna Unika

Laravel huwa wieħed mill-oqfsa PHP l-aktar popolari użati mill-iżviluppaturi, ejja naraw illum kif tagħmel Applikazzjoni ta 'Paġna Unika b'VueJs.

Qabel it-tnedija ta 'Laravel UI, waħda mill-karatteristiċi ewlenin tagħha kienet l-appoġġ minn qabeldefinite għal Vue.js minn Laravel v5.3 sa v6. Vue huwa qafas ta' frontend JavaScript modern użat biex jinbnew interfaces tal-utent.

Għaliex tinstalla Laravel u Vue flimkien?

Hawn huma xi wħud mill-benefiċċji ewlenin tal-użu ta 'Laravel ma' Vue biex toħloq fluss tax-xogħol sħiħ għall-proġetti tiegħek:

Il-kodiċi tas-sors huwa kkombinat fi proġett wieħed, minflok ma jkollu proġetti separati għall-backend u l-frontend
L-installazzjoni u l-konfigurazzjoni huma sempliċi
Distribuzzjoni waħda tista' timmaniġġja ż-żewġ oqfsa flimkien

X'inhu SPA? (applikazzjoni ta' paġna waħda)

a applikazzjoni ta' paġna waħda (SPA fil-qosor) jgħabbi b'mod dinamiku dejta ġdida minn server tal-web f'paġna web mingħajr ma jkollok bżonn taġġorna l-paġna kollha.

Eżempji ta’ websajts popolari li jużaw SPAs jinkludu gmail.com u youtube.com – fi kliem ieħor, SPAs huma ġeneralment kullimkien. Ħafna mid-dashboards tal-amministrazzjoni li tista' taħdem magħhom kuljum huma mibnija bl-użu tal-SPA.

Vantaġġi ta 'SPAs:

L-esperjenza tal-utent hija aktar flessibbli
Cache data fil-browser
Ħin mgħaġġel tat-tagħbija


Żvantaġġi ta' SPAs:

Jista' jikkomprometti SEO (search engine optimization)
Kwistjonijiet ta' sigurtà potenzjali
Jikkonsma ħafna riżorsi tal-browser

Konfigurazzjoni tal-proġett f'Laravel

Din il-kariga se turi kif tiżviluppa app għall-affarijiet li tippermetti lill-utenti jiffirmaw għal kont u jżidu l-kompiti.

Għal dan it-tutorja, jintuża Laravel 9, li jeħtieġ PHP 8.1 u Vue 3; jeħtieġ ukoll li jkollna PHP u NGINX installati.

Nibdew bil-kmand li ġej:

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

Sussegwentement, aħna ser ninstallaw id-dipendenzi JavaScript.

npm install

Għandna bżonn ninstallaw xi pakketti qabel ma nistgħu nżidu Vue mal-proġett tagħna.

Ukoll, il-plugin-vue għandu jiġi installat, peress li Laravel 9 jibgħat ma 'Vite, aktar milli webpack-mix, li kien il-bundler Laravel preċedenti għal JavaScript. Ejja nagħmluha issa:

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

Iftaħ il-fajl imsejjaħ vite.config.js u żid vue() għall-konfigurazzjoni:

Newsletter dwar l-innovazzjoni
Titlifx l-aktar aħbarijiet importanti dwar l-innovazzjoni. Irreġistra biex tirċevihom bl-email.
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',
        ]),
    ],
});

Editja l-fajl app.js u snippet bootstrap għall-app Vue 3:

require('./bootstrap');

import {createApp} from 'vue'

import App from './App.vue'

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

Oħloq fajl imsejjaħ App.vue u żid dan li ġej:

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

   }
}
</script>

Fl-aħħarnett, iftaħ il-fajl welcome.blade.php jinsab fil-folder resources/views u żid dan li ġej:

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

Biex tipprevedi l-app tagħna, irridu nibdew l-app Vue tagħna u s-server Laravel fuq żewġ terminals/linji ta’ kmand differenti:

npm run dev


php artisan serve

Biex noħolqu l-app tagħna għall-affarijiet, irridu noħolqu fajls oħra. Vue se toħloq bosta paġni, prinċipalment:

  • ta’ aċċess
  • għar-reġistrazzjoni
  • Home page


Biex nikkomunikaw ma 'endpoints ta' Laravel, irridu ninstallaw Axios:

npm install axios

vue routing

Bl-użu tal-pakkett vue-router, hemm diversi strateġiji ta 'routing li jistgħu jintużaw f'Vue; dawn l-istrateġiji huma magħrufa wkoll bħala history models.

Meta utent jitlob route bħal http://localhost:8000/home, li se jirritorna żball 404 meta l-paġna tiġi aggornata, nistgħu nistrieħu fuq Laravel biex jiskopru xi rotot ta 'riżerva u mbagħad iservu l-fajl Blade li fih l-app tagħna.

Għal din ir-raġuni, se nużaw il-modalità 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')
        }
    ],
})

F'dan l-eżempju nittrattaw l-awtentikazzjoni bl-użu Laravel Sanctum, imbagħad it-token jiġi ffrankat fil-ħażna lokali.

Għal talbiet oħra biex jirnexxu, it-token jiġi magħqud fl-header, li jippermetti li l-utent li jagħmel it-talba jiġi identifikat minn Laravel.

Hawn huma l-blokki tal-kodiċi assoċjati għat-tnejn:

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

Jista 'jkun ukoll interessat fi ...

Newsletter dwar l-innovazzjoni
Titlifx l-aktar aħbarijiet importanti dwar l-innovazzjoni. Irreġistra biex tirċevihom bl-email.

Artikoli riċenti

Il-Futur qiegħed Hawnhekk: Kif l-Industrija tat-Tbaħħir qed tirrivoluzzjona l-Ekonomija Globali

Is-settur navali huwa qawwa ekonomika globali vera, li navigat lejn suq ta’ 150 biljun...

1 Mejju 2024

Il-pubblikaturi u l-OpenAI jiffirmaw ftehimiet biex jirregolaw il-fluss tal-informazzjoni pproċessata mill-Intelliġenza Artifiċjali

It-Tnejn li għadda, il-Financial Times ħabbret ftehim mal-OpenAI. FT tagħti liċenzja għall-ġurnaliżmu ta’ klassi dinjija tagħha...

April 30 2024

Ħlasijiet Online: Hawn Kif Is-Servizzi ta' Streaming Jagħmel Inti Tħallas Għal Dejjem

Miljuni ta 'nies iħallsu għal servizzi ta' streaming, iħallsu miżati ta 'abbonament ta' kull xahar. Hija opinjoni komuni li inti...

April 29 2024

Veeam għandu l-aktar appoġġ komprensiv għar-ransomware, mill-protezzjoni għar-rispons u l-irkupru

Coveware minn Veeam se jkompli jipprovdi servizzi ta' rispons għal inċidenti ta' estorsjoni ċibernetika. Coveware se joffri forensiċi u kapaċitajiet ta' rimedju...

April 23 2024