Layouts y componentes
Los layouts te permiten definir una estructura HTML común que reutilizas en todas tus páginas. Los componentes encapsulan fragmentos de UI reutilizables.
¿Qué es un layout?
Un layout es una plantilla base que define la estructura HTML común de tu sitio (header, footer, navegación). Las páginas heredan del layout e inyectan su contenido específico.
Crear un layout
Crea el archivo
resources/views/layouts/app.blade.php:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>@yield('title') - Mi App</title>
</head>
<body>
<nav>
<a href="/">Inicio</a>
<a href="/about">Acerca de</a>
</nav>
<main>
@yield('content')
</main>
<footer>
<p>© 2025 Mi App</p>
</footer>
</body>
</html>
@yield('nombre') define un
placeholder donde las vistas hijas inyectarán
contenido.
Extender un layout
Las vistas usan @extends para
heredar del layout y @section para
definir el contenido:
{{-- resources/views/home.blade.php --}}
@extends('layouts.app')
@section('title', 'Inicio')
@section('content')
<h1>Bienvenido a Mi App</h1>
<p>Esta es la página de inicio.</p>
@endsection
Incluir vistas parciales
@include inserta otra vista dentro
de la actual:
{{-- En el layout --}}
<nav>
@include('partials.navigation')
</nav>
{{-- Pasar datos al partial --}}
@include('partials.alert', ['message' => 'Guardado correctamente'])
Componentes anónimos
Los componentes son fragmentos de UI
reutilizables. Crea un archivo en
resources/views/components/:
{{-- resources/views/components/alert.blade.php --}}
<div class="alert alert-{{ $type }}">
{{ $slot }}
</div>
Úsalo con la sintaxis
<x-nombre>:
<x-alert type="success">
Operación completada con éxito
</x-alert>
<x-alert type="error">
Ha ocurrido un error
</x-alert>
El contenido entre las etiquetas se pasa como
$slot. Los atributos se pasan como
variables ($type).
Componentes en subcarpetas
{{-- Archivo: components/form/input.blade.php --}}
{{-- Uso: --}}
<x-form.input name="email" type="email" />
Usa @include para partials
simples. Usa componentes
<x-...> cuando
necesites pasar datos con atributos o
slots.
Ejercicios
Ejercicio 1: Crear un layout
Crea un layout
layouts/main.blade.php con header,
main y footer. Define un
@yield('content')
en el main.
Ver solución
{{-- resources/views/layouts/main.blade.php --}}
<!DOCTYPE html>
<html>
<head>
<title>@yield('title', 'Mi Sitio')</title>
</head>
<body>
<header>
<h1>Mi Sitio</h1>
</header>
<main>
@yield('content')
</main>
<footer>
<p>Copyright 2025</p>
</footer>
</body>
</html>
Ejercicio 2: Extender el layout
Crea una vista contact.blade.php
que extienda el layout anterior y muestre un
formulario de contacto.
Ver solución
{{-- resources/views/contact.blade.php --}}
@extends('layouts.main')
@section('title', 'Contacto')
@section('content')
<h2>Contáctanos</h2>
<form>
<input type="text" name="name" placeholder="Nombre">
<input type="email" name="email" placeholder="Email">
<button type="submit">Enviar</button>
</form>
@endsection
Ejercicio 3: Crear un componente
Crea un componente
button.blade.php que reciba un
atributo color y muestre el texto
del slot.
Ver solución
{{-- resources/views/components/button.blade.php --}}
<button class="btn btn-{{ $color ?? 'primary' }}">
{{ $slot }}
</button>
{{-- Uso --}}
<x-button color="success">Guardar</x-button>
<x-button color="danger">Eliminar</x-button>
Resumen
- Layouts definen la estructura HTML común
-
@yield('nombre')define placeholders en el layout -
@extends('layout')hereda de un layout -
@section('nombre')define el contenido para un yield -
@include('vista')inserta un partial -
Componentes van en
views/components/ -
<x-nombre>usa un componente,$slotes el contenido
¿Has encontrado un error o tienes una sugerencia para mejorar esta lección?
Escríbenos¿Te está gustando el curso?
Tenemos cursos premium con proyectos reales, soporte personalizado y certificado.
Descubrir cursos premium