3. Rutas y controladores en Laravel
Rutas y controladores en Laravel
Section titled “Rutas y controladores en Laravel”En una aplicación Inertia.js, la integración entre Laravel y Vue se realiza a través de rutas y controladores que renderizan componentes Vue. Esta sección explica cómo configurar correctamente estas conexiones.
Rutas web con Route::inertia()
Section titled “Rutas web con Route::inertia()”Inertia.js proporciona un método de ayuda Route::inertia() que simplifica la creación de rutas que renderizan componentes Vue. Este método es un atajo que combina la definición de la ruta y el renderizado del componente en una sola línea.
Route::inertia('/about', 'About');Este código hace dos cosas:
- Define una ruta GET para la URL
/about - Renderiza el componente Vue ubicado en
resources/js/Pages/About.vue
Puedes pasar datos (props) directamente en la definición de la ruta:
Route::inertia('/users', 'Users/Index', [ 'users' => User::all()]);Rutas tipo resource con Inertia
Section titled “Rutas tipo resource con Inertia”Las rutas de tipo resource son muy comunes en aplicaciones Laravel para operaciones CRUD. Con Inertia, puedes seguir usando este patrón y conectarlo con componentes Vue correspondientes.
// Definir rutas resourceRoute::resource('users', UserController::class);Esto generará las siguientes rutas que deberán corresponder con métodos en tu controlador:
Controladores que retornan Inertia::render()
Section titled “Controladores que retornan Inertia::render()”Para renderizar componentes Vue desde un controlador Laravel, usamos el método Inertia::render():
<?php
namespace AppHttpControllers;
use AppModelsUser;use InertiaInertia;use IlluminateHttpRequest;
class UserController extends Controller{ public function index() { return Inertia::render('Users/Index', [ 'users' => User::all() ]); }
public function show(User $user) { return Inertia::render('Users/Show', [ 'user' => $user ]); }
public function create() { return Inertia::render('Users/Create'); }
public function edit(User $user) { return Inertia::render('Users/Edit', [ 'user' => $user ]); }
// Otros métodos del controlador...}El método Inertia::render() acepta dos parámetros:
- El nombre del componente Vue a renderizar (relativo a tu directorio de páginas)
- Un array asociativo de datos (props) que se pasarán al componente Vue
Paso de props desde Laravel a Vue
Section titled “Paso de props desde Laravel a Vue”Una de las características más potentes de Inertia.js es la facilidad para pasar datos desde el backend (Laravel) al frontend (Vue). Estos datos se conocen como “props”.
Datos simples
Section titled “Datos simples”return Inertia::render('Dashboard', [ 'name' => 'John Doe', 'email' => 'john@example.com',]);Modelos Eloquent
Section titled “Modelos Eloquent”Puedes pasar modelos Eloquent directamente. Inertia los convertirá automáticamente a arrays/objetos JSON:
return Inertia::render('Users/Show', [ 'user' => User::find($id)]);Colecciones
Section titled “Colecciones”Las colecciones también se serializan automáticamente:
return Inertia::render('Users/Index', [ 'users' => User::all()]);Paginación
Section titled “Paginación”La paginación funciona perfectamente con Inertia:
return Inertia::render('Users/Index', [ 'users' => User::paginate(10)]);Acceso a props en componentes Vue
Section titled “Acceso a props en componentes Vue”En tus componentes Vue con Composition API, puedes acceder a estas props fácilmente:
<script setup>import { defineProps } from 'vue';
// Definir y acceder a las propsconst props = defineProps({user: Object,});
console.log(props.user.name);</script>
<template><div> <h1>{{ user.name }}</h1> <p>{{ user.email }}</p></div></template>COMPONENTES EN VUE 3 CON COMPOSITION API
Section titled “COMPONENTES EN VUE 3 CON COMPOSITION API”Inertia.js funciona perfectamente con Vue 3 y la Composition API, permitiéndote aprovechar todas sus características modernas. Aquí hay algunos conceptos clave para trabajar con componentes Vue 3 usando Composition API en aplicaciones Inertia:
Estructura básica de un componente con Composition API
Section titled “Estructura básica de un componente con Composition API”<script setup>import { ref, onMounted } from 'vue';import Layout from '@/Layouts/MainLayout.vue';import { Head } from '@inertiajs/vue3';
// Define propsconst props = defineProps({users: Array,});
// Estado reactivoconst counter = ref(0);
// Métodosconst increment = () => {counter.value++;};
// Hooks de ciclo de vidaonMounted(() => {console.log('Componente montado');});</script>
<template><Head title="Lista de usuarios" /><Layout> <h1>Usuarios ({{ users.length }})</h1> <ul> <li v-for="user in users" :key="user.id"> {{ user.name }} </li> </ul> <div> <p>Contador: {{ counter }}</p> <button @click="increment">Incrementar</button> </div></Layout></template>Layouts en Inertia con Vue 3
Section titled “Layouts en Inertia con Vue 3”Inertia recomienda usar layouts persistentes para mejorar la experiencia del usuario:
<script setup>import { Head } from '@inertiajs/vue3';import Navbar from '@/Components/Navbar.vue';import Footer from '@/Components/Footer.vue';</script>
<template><div class="layout"> <Navbar /> <main> <slot></slot> </main> <Footer /></div></template>Navegación con Inertia en Vue 3
Section titled “Navegación con Inertia en Vue 3”Inertia proporciona un componente Link y una función router para la navegación entre páginas sin recargar completamente:
<script setup>import { Link } from '@inertiajs/vue3';</script>
<template><div> <!-- Navegación con el componente Link --> <Link href="/users" class="btn">Ver usuarios</Link> <Link :href="`/users/${userId}`" class="btn">Ver usuario</Link>
<!-- Con parámetros adicionales --> <Link href="/users" :data="{ search: 'John' }" :only="['users']" preserve-scroll > Buscar usuarios </Link></div></template>También puedes usar el router programáticamente:
<script setup>import { router } from '@inertiajs/vue3';
const goToUsers = () => {router.visit('/users');};
const createUser = (userData) => {router.post('/users', userData, { onSuccess: () => { alert('Usuario creado con éxito'); }, preserveScroll: true,});};</script>Acceso global a datos compartidos
Section titled “Acceso global a datos compartidos”Inertia permite compartir datos globalmente en toda la aplicación usando la propiedad $page:
<script setup>import { computed } from 'vue';import { usePage } from '@inertiajs/vue3';
// Acceder a datos compartidosconst page = usePage();const user = computed(() => page.props.auth.user);const isAdmin = computed(() => user.value?.role === 'admin');</script>
<template><div> <p v-if="user">Bienvenido, {{ user.name }}</p> <div v-if="isAdmin" class="admin-panel"> <!-- Panel de administración --> </div></div></template>En Laravel, puedes compartir estos datos en el middleware HandleInertiaRequests:
public function share(Request $request): array{ return [ 'auth' => [ 'user' => $request->user() ? [ 'id' => $request->user()->id, 'name' => $request->user()->name, 'email' => $request->user()->email, 'role' => $request->user()->role, ] : null, ], 'flash' => [ 'message' => fn () => $request->session()->get('message'), 'error' => fn () => $request->session()->get('error'), ], ];}