Módulo 2 · Lección 5 20 min

Directivas Blade más usadas

Domina las directivas Blade esenciales: @auth, @guest, @isset, @empty, @switch, @each y cómo crear tus propias directivas personalizadas.

Las directivas como vocabulario de Blade

Las directivas Blade son instrucciones que comienzan con @ y que el motor de plantillas compila a PHP puro antes de renderizar la vista. Ya conoces las básicas como @if, @foreach y @extends. En esta lección exploraremos las directivas más útiles del día a día que hacen el código de las vistas más expresivo y seguro.

Directivas de autenticación: @auth y @guest

Una de las necesidades más comunes en cualquier aplicación web es mostrar contenido diferente según si el usuario ha iniciado sesión o no. Blade proporciona dos directivas para esto:

@auth
    <p>Bienvenido, {{ auth()->user()->nombre }}.</p>
    <a href="/dashboard">Ir al panel</a>
    <form method="POST" action="/logout">
        @csrf
        <button type="submit">Cerrar sesión</button>
    </form>
@endauth

@guest
    <a href="/login">Iniciar sesión</a>
    <a href="/register">Registrarse</a>
@endguest

Estas directivas son mucho más legibles que @if(auth()->check()) y comunican la intención directamente.

También puedes combinarlas con @else:

@auth
    <span>Panel de usuario</span>
@else
    <a href="/login">Acceder</a>
@endauth

Si tu aplicación usa múltiples guards de autenticación, puedes especificar cuál usar:

@auth('admin')
    <p>Estás autenticado como administrador.</p>
@endauth

Directivas de comprobación: @isset y @empty

@isset comprueba que una variable exista y no sea null. Es ideal cuando no puedes garantizar que el controlador siempre envíe esa variable:

@isset($post->imagen)
    <img src="{{ asset('storage/' . $post->imagen) }}" alt="{{ $post->titulo }}">
@endisset

@empty comprueba si una variable está vacía (string vacío, array vacío, null, 0, etc.):

@empty($post->etiquetas)
    <span>Sin etiquetas</span>
@else
    @foreach ($post->etiquetas as $etiqueta)
        <span class="tag">{{ $etiqueta->nombre }}</span>
    @endforeach
@endempty

Directiva @switch

Para múltiples condiciones sobre el mismo valor, @switch es más limpio que una cadena de @elseif:

@switch($post->estado)
    @case('publicado')
        <span class="badge verde">Publicado</span>
        @break

    @case('borrador')
        <span class="badge gris">Borrador</span>
        @break

    @case('archivado')
        <span class="badge rojo">Archivado</span>
        @break

    @default
        <span class="badge">Desconocido</span>
@endswitch

Directiva @checked, @selected y @disabled

Estas directivas de formulario, disponibles desde Laravel 9, simplifican la gestión de estado en campos de formulario:

{{-- @checked imprime checked="checked" si la condición es verdadera --}}
<input type="checkbox" name="activo" @checked($usuario->activo)>

{{-- @selected imprime selected="selected" si los valores coinciden --}}
<select name="categoria_id">
    @foreach ($categorias as $categoria)
        <option value="{{ $categoria->id }}" @selected($post->categoria_id === $categoria->id)>
            {{ $categoria->nombre }}
        </option>
    @endforeach
</select>

{{-- @disabled imprime disabled si la condición es verdadera --}}
<button type="submit" @disabled($formulario->enviando)>
    Guardar cambios
</button>

{{-- @readonly imprime readonly si la condición es verdadera --}}
<input type="text" name="email" value="{{ $usuario->email }}" @readonly($usuario->verificado)>

Directiva @env

Permite mostrar contenido solo en determinados entornos. Útil para mostrar herramientas de depuración solo en desarrollo:

@env('local')
    <div class="debug-bar">
        Entorno: local | Queries: {{ DB::getQueryLog() | count }}
    </div>
@endenv

@env(['staging', 'production'])
    <!-- Google Analytics solo en staging y producción -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXX"></script>
@endenv

Directiva @each

@each es un atajo para iterar sobre una colección y renderizar una vista parcial por cada elemento. Recibe cuatro argumentos: la vista a renderizar, la colección, el nombre de la variable en la vista y (opcionalmente) la vista a mostrar si la colección está vacía:

{{-- Equivalente a un @foreach con @include --}}
@each('partials.tarjeta-post', $posts, 'post', 'partials.sin-posts')

La vista resources/views/partials/tarjeta-post.blade.php recibirá cada elemento como $post.

Directivas de CSRF y método HTTP

Estas dos directivas son esenciales en cualquier formulario Laravel:

<form method="POST" action="/posts">
    @csrf

    <input type="text" name="titulo" placeholder="Título del artículo">
    <textarea name="contenido"></textarea>
    <button type="submit">Publicar</button>
</form>

@csrf genera un campo oculto con el token de seguridad que Laravel usa para validar que el formulario fue enviado desde tu propia aplicación y no desde un sitio externo (protección CSRF).

Para formularios que necesitan enviar peticiones PUT, PATCH o DELETE (que HTML no soporta nativamente), se usa @method:

<form method="POST" action="/posts/{{ $post->id }}">
    @csrf
    @method('PUT')

    <input type="text" name="titulo" value="{{ $post->titulo }}">
    <button type="submit">Actualizar</button>
</form>

Directiva @error

Blade incluye una directiva específica para mostrar errores de validación de formularios, muy integrada con el sistema de validación de Laravel:

<div class="campo">
    <label for="titulo">Título</label>
    <input
        type="text"
        id="titulo"
        name="titulo"
        value="{{ old('titulo') }}"
        class="@error('titulo') campo-error @enderror"
    >
    @error('titulo')
        <span class="mensaje-error">{{ $message }}</span>
    @enderror
</div>

@error('campo') comprueba si existe un error de validación para ese campo. Si existe, la variable $message contiene el mensaje de error. old('titulo') recupera el valor que el usuario había introducido antes de que fallara la validación.

Directiva @include con condición: @includeIf y @includeWhen

{{-- Solo incluye si el archivo existe (no lanza error si no) --}}
@includeIf('partials.anuncio-beta')

{{-- Solo incluye si la condición es verdadera --}}
@includeWhen($usuario->esPremium(), 'partials.contenido-premium', ['usuario' => $usuario])

{{-- Solo incluye si la condición es FALSA --}}
@includeUnless($usuario->estaVerificado(), 'partials.alerta-verificacion')

Crear directivas personalizadas

Si necesitas una directiva que no existe en Blade, puedes crearla registrándola en el método boot() de un proveedor de servicios con Blade::directive():

// app/Providers/AppServiceProvider.php

use Illuminate\Support\Facades\Blade;

public function boot(): void
{
    // Directiva para formatear fechas en español
    Blade::directive('fecha', function (string $expression) {
        return "<?php echo \Carbon\Carbon::parse($expression)->locale('es')->isoFormat('D [de] MMMM [de] YYYY'); ?>";
    });

    // Directiva para precio formateado en euros
    Blade::directive('precio', function (string $expression) {
        return "<?php echo number_format($expression, 2, ',', '.') . ' €'; ?>";
    });

    // Directiva de apertura y cierre
    Blade::directive('tarjeta', function () {
        return '<div class="tarjeta">';
    });

    Blade::directive('endtarjeta', function () {
        return '</div>';
    });
}

Uso en las vistas:

<p>Publicado: @fecha($post->created_at)</p>
<p>Precio: @precio($producto->precio)</p>

@tarjeta
    <h2>{{ $post->titulo }}</h2>
@endtarjeta

Tabla resumen de directivas esenciales

DirectivaUso
@auth / @guestContenido según estado de autenticación
@isset($var)Variable existe y no es null
@empty($var)Variable está vacía
@switch / @caseCondicional de múltiples ramas
@checkedAtributo checked en checkboxes
@selectedAtributo selected en opciones
@disabledAtributo disabled
@csrfToken de protección CSRF
@method('PUT')Simular métodos HTTP
@error('campo')Mostrar errores de validación
@env('local')Contenido por entorno
@includeWhen($cond, 'vista')Include condicional

Resumen

En esta lección repasaste el conjunto de directivas Blade más utilizadas en aplicaciones Laravel reales: desde @auth y @guest para el control de acceso, pasando por @isset, @empty y @switch para la lógica condicional, hasta las directivas de formulario como @csrf, @method y @error. También aprendiste a crear tus propias directivas con Blade::directive() para encapsular lógica de presentación personalizada. Con todo lo visto en este módulo tienes una base sólida para construir interfaces Blade profesionales en cualquier proyecto Laravel.

Quiz

Pon a prueba lo aprendido

Responde las preguntas para comprobar que has entendido los conceptos clave.

1. ¿Qué directiva Blade muestra contenido solo cuando el usuario ha iniciado sesión?

2. ¿Cuál es la directiva correcta para verificar si una variable está definida y no es null?

3. ¿Qué método de la facade Blade se usa para registrar una directiva personalizada?