02-01-01-componentes-b-e
Plantillas de Blade con Laravel 11
Si alguna vez has utilizado Vue.js o ReactJS, estarás familiarizado con el concepto de componentes. En Laravel también contamos con componentes de Blade y los vamos a utilizar para crear nuestro layout y extraer este contenido repetido.
Creando componentes de Blade
Los componentes de Blade se ubican en la carpeta resources/views/components. Aquí tenemos varios archivos que se generaron automáticamente al elegir Laravel Breeze (hablaremos de esto más adelante).
Vamos a crear un componente llamado layout.blade.php. Actualmente, lo único que cambia en nuestras vistas es el <h1>, así que:
Copiamos la parte superior de la vista (head, meta tags, etc.) y la pegamos en el layout
Copiamos el cierre (footer, scripts, etc.) y lo pegamos al final del layout
Dentro de todo componente de Blade tenemos disponible una variable reservada especial llamada $slot donde se imprimirá el contenido variable. Es similar a los slots en VueJS o a children en React.
Blade en Laravel + Componentes
Blade es el motor de plantillas de Laravel que ofrece una sintaxis elegante y potente para trabajar con vistas. Aquí te presento una guía estructurada con los conceptos esenciales y el uso de componentes.
Para utilizar nuestro componente en la vista welcome.blade.php:
Dejamos solo el <h1> en la vista
Tenemos dos opciones para usar el componente:
Opción 1: Directiva @component
blade
@component('components.layout')
<!-- Contenido que irá en el $slot -->
@endcomponent
Opción 2: Etiqueta de componente (recomendada)
blade
<x-layout>
<!-- Contenido que irá en el $slot -->
</x-layout>
La segunda opción es más limpia y asume automáticamente que el componente está en la carpeta components.
Slots con nombre para contenido opcional
Si queremos agregar un sidebar opcional:
En el layout:
blade
@isset($sidebar)
<div id="sidebar">{{ $sidebar }}</div>
@endisset
<!-- Alternativa más corta: -->
@isset($sidebar)
{{ $sidebar }}
@endisset
En la vista:
blade
<x-layout>
<x-slot name="sidebar">
<!-- Contenido del sidebar -->
</x-slot>
</x-layout>
Propiedades del componente
Para modificar metadatos como título y descripción:
En el layout:
blade
<title>{{ $metaTitle ?? 'Título por defecto' }}</title>
<meta name="description" content="{{ $metaDescription ?? 'Descripción por defecto' }}">
En la vista (como atributos):
blade
<x-layout
:meta-title="Título personalizado"
:meta-description="Descripción personalizada"
>
<!-- Nota: usamos kebab-case en atributos pero camelCase en propiedades -->
</x-layout>
Componentes anidados
Si tenemos componentes en subcarpetas:
blade
<x-navigation.main /> <!-- Para components/navigation/main.blade.php -->
Evaluando código PHP en propiedades
Si necesitamos evaluar código PHP en las propiedades:
blade
<x-component :prop=":2 + 2" /> <!-- Evaluará a 4 -->
<x-component prop="2 + 2" /> <!-- Mostrará el string "2 + 2" -->
Conclusión
Con estos cambios, podemos actualizar todas nuestras vistas para usar el layout consistente. Los componentes de Blade nos permiten:
Reducir código repetido
Crear plantillas reutilizables
Mantener una estructura limpia y organizada
Trabajar con lógica opcional (slots)
3. Componentes en Blade
A. Crear un Componente
bash
Copy
Download
php artisan make:component Alert
📌 Estructura generada:
app/View/Components/Alert.php (Clase)
resources/views/components/alert.blade.php (Vista)
B. Componente Básico (Alert.php)
php
namespace App\View\Components;
use Illuminate\View\Component;
class Alert extends Component
{
public $type;
public function __construct($type = 'info')
{
$this->type = $type;
}
public function render()
{
return view('components.alert');
}
}
C. Vista del Componente (alert.blade.php)
php
Copy
Download
<div class="alert alert-{{ $type }}">
{{ $slot }} <!-- Contenido pasado al componente -->
</div>
D. Uso del Componente
php
Copy
Download
<x-alert type="success">
¡Operación exitosa!
</x-alert>
E. Componentes con Slots Nombrados
php
Copy
Download
<!-- resources/views/components/card.blade.php -->
<div class="card">
<div class="card-header">
{{ $title }}
</div>
<div class="card-body">
{{ $slot }}
</div>
</div>
<!-- Uso -->
<x-card>
@slot('title') Título Personalizado @endslot
Contenido del card...
</x-card>
4. Directivas Personalizadas
A. Registrar en AppServiceProvider
php
Copy
Download
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('d/m/Y H:i'); ?>";
});
}
B. Uso en Vistas
php
Copy
Download
@datetime($post->created_at)
5. Includes y Fragmentos
A. Incluir Sub-vistas
php
Copy
Download
@include('partials.header', ['title' => 'Inicio'])
B. Fragmentos Reutilizables
php
Copy
Download
<!-- partials/buttons.blade.php -->
@props(['type' => 'submit'])
<button type="{{ $type }}" {{ $attributes }}>
{{ $slot }}
</button>
<!-- Uso -->
<x-buttons class="btn-primary">Enviar</x-buttons>
6. Tabla Comparativa: Blade vs Componentes
7. Consejos Avanzados
Atributos Dinámicos:
php
Copy
Download
<x-button {{ $attributes->merge(['class' => 'btn']) }}>
Componentes Anónimos (Laravel 8+):
bash
Copy
Download
php artisan make:component forms.input --inline
Acceder a Atributos:
php
Copy
Download
{{ $attributes->get('class') }}
8. Ejemplo Completo: Sistema de Notificaciones
Componente (Notification.php)
php
Copy
Download
public $type;
public $message;
public function __construct($type = 'info', $message = '')
{
$this->type = $type;
$this->message = $message;
}
Vista (notification.blade.php)
php
Copy
Download
<div class="notification notification-{{ $type }}">
{{ $message ?? $slot }}
</div>
Uso
php
Copy
Download
<x-notification type="error" message="Error crítico"/>
<!-- O -->
<x-notification type="success">
Registro completado!
</x-notification>
Comentarios
Publicar un comentario