bens

Vue e Laravel: crie um aplicativo de página única

O Laravel é um dos frameworks PHP mais populares usados ​​pelos desenvolvedores, vamos ver hoje como fazer uma Aplicação de Página Única com VueJs.

Antes do lançamento do Laravel UI, um de seus principais recursos era o pré-suportedefinoite para Vue.js de Laravel v5.3 a v6. Vue é uma estrutura de front-end JavaScript moderna usada para criar interfaces de usuário.

Por que instalar Laravel e Vue juntos?

Aqui estão alguns dos principais benefícios de usar Laravel com Vue para criar um fluxo de trabalho completo para seus projetos:

O código-fonte é combinado em um projeto, em vez de ter projetos separados para back-end e front-end
A instalação e configuração são simples
Uma única distribuição pode gerenciar os dois frameworks juntos

O que é um SPA? (aplicativo de página única)

Uma aplicativo de página única (SPA para abreviar) carrega dinamicamente novos dados de um servidor web em uma página web sem ter que atualizar a página inteira.

Exemplos de sites populares que usam SPAs incluem gmail.com e youtube.com – em outras palavras, os SPAs são amplamente onipresentes. A maioria dos painéis administrativos com os quais você pode trabalhar diariamente é criada usando o SPA.

Vantagens dos SPAs:

A experiência do usuário é mais flexível
Cache de dados no navegador
Tempo de carregamento rápido


Desvantagens dos SPAs:

Pode comprometer o SEO (otimização do mecanismo de pesquisa)
Possíveis problemas de segurança
Consome muitos recursos do navegador

Configuração do projeto no Laravel

Esta postagem demonstrará como desenvolver um aplicativo de tarefas que permite aos usuários se inscrever em uma conta e adicionar tarefas.

Para este tutorial, é utilizado o Laravel 9, que requer PHP 8.1 e Vue 3; também precisamos ter PHP e NGINX instalados.

Iniciamos com o seguinte comando:

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

Em seguida, instalaremos as dependências do JavaScript.

npm install

Precisamos instalar alguns pacotes antes de podermos adicionar o Vue ao nosso projeto.

Além disso, o plugin-vue deve ser instalado, já que o Laravel 9 vem com o Vite, em vez do webpack-mix, que era o empacotador anterior do Laravel para JavaScript. Vamos fazer agora:

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

Abra o arquivo chamado vite.config.js e adicione vue() para configuração:

Boletim de inovação
Não perca as notícias mais importantes sobre inovação. Cadastre-se para recebê-los por 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',
        ]),
    ],
});

Edite o arquivo app.js e o trecho de bootstrap para o aplicativo Vue 3:

require('./bootstrap');

import {createApp} from 'vue'

import App from './App.vue'

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

Crie um arquivo chamado App.vue e adicione o seguinte:

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

   }
}
</script>

Por fim, abra o arquivo welcome.blade.php localizado na pasta resources/views e adicione o seguinte:

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

Para visualizar nosso aplicativo, precisamos iniciar nosso aplicativo Vue e o servidor Laravel em dois terminais/linhas de comando diferentes:

npm run dev


php artisan serve

Para criar nosso aplicativo de tarefas, precisamos criar outros arquivos. O Vue criará várias páginas, principalmente:

  • de acesso
  • para registro
  • Uma página inicial


Para se comunicar com os endpoints do Laravel, precisamos instalar o Axios:

npm install axios

roteamento vue

Usando o pacote vue-router, existem várias estratégias de roteamento que podem ser usadas no Vue; Essas estratégias também são conhecidas como history models.

Quando um usuário solicita route como http://localhost:8000/home, que retornará um erro 404 quando a página for atualizada, podemos confiar no Laravel para detectar quaisquer rotas de fallback e, em seguida, servir o arquivo Blade que contém nosso aplicativo.

Por esse motivo, usaremos o modo 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')
        }
    ],
})

Neste exemplo, lidamos com a autenticação usando Laravel SanctumName, então o token é salvo no armazenamento local.

Para que outras solicitações sejam bem-sucedidas, o token é mesclado no cabeçalho, o que permitirá que o usuário que fez a solicitação seja identificado pelo Laravel.

Aqui estão os blocos de código associados para ambos:

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

Você também pode estar interessado em ...

Boletim de inovação
Não perca as notícias mais importantes sobre inovação. Cadastre-se para recebê-los por e-mail.

Artigos recentes

A Veeam oferece o suporte mais abrangente para ransomware, desde proteção até resposta e recuperação

A Coveware by Veeam continuará a fornecer serviços de resposta a incidentes de extorsão cibernética. A Coveware oferecerá recursos forenses e de remediação…

Abril 23 2024

Revolução Verde e Digital: Como a Manutenção Preditiva está Transformando a Indústria de Petróleo e Gás

A manutenção preditiva está revolucionando o setor de petróleo e gás, com uma abordagem inovadora e proativa para o gerenciamento de plantas.…

Abril 22 2024

Regulador antitruste do Reino Unido levanta alarme da BigTech sobre GenAI

A CMA do Reino Unido emitiu um alerta sobre o comportamento da Big Tech no mercado de inteligência artificial. Lá…

Abril 18 2024

Casa Green: revolução energética para um futuro sustentável na Itália

O Decreto "Case Green", formulado pela União Europeia para melhorar a eficiência energética dos edifícios, concluiu o seu processo legislativo com…

Abril 18 2024