3. Blade, el motor de plantillas de Laravel 11
Características principales de Blade
Sintaxis Limpia
Blade usa directivas (@directiva) que se compilan a código PHP puro, pero son más fáciles de leer y escribir.
Ejemplo:@if($user->isAdmin()) <p>Eres administrador</p> @else <p>Eres usuario normal</p> @endifHerencia de Layouts
Permite definir plantillas base (layouts) que pueden ser extendidas por otras vistas, evitando repetir código (como headers/footers).Ejemplo de layout (
resources/views/layouts/app.blade.php):<html> <head><title>@yield('title')</title></head> <body> @section('sidebar') Contenido del sidebar @show <div class="container"> @yield('content') </div> </body> </html>Extender el layout:
@extends('layouts.app') @section('title', 'Página de inicio') @section('content') <h1>Contenido principal</h1> @endsection
Inclusión de Subvistas
Usa@includepara reutilizar componentes:@include('shared.header')Mostrar Datos
Escapa automáticamente variables para prevenir XSS:<p>{{ $user->name }}</p> <!-- Escapado --> <p>{!! $rawHtml !!}</p> <!-- Sin escapar (usar con cuidado) -->Bucles y Condicionales
Similar a PHP pero más legible:@foreach($users as $user) <p>{{ $user->email }}</p> @endforeach @for($i = 0; $i < 10; $i++) {{ $i }} @endforComponentes y Slots
Ideal para elementos reutilizables (ej. alertas, cards):<!-- resources/views/components/alert.blade.php --> <div class="alert alert-{{ $type }}"> {{ $slot }} <!-- Contenido dinámico --> </div> <!-- Uso --> <x-alert type="success"> ¡Operación exitosa! </x-alert>Stacks y Push
Para agregar CSS/JS específicos en layouts:@push('scripts') <script src="/js/custom.js"></script> @endpush <!-- En el layout --> @stack('scripts')Directivas Personalizadas
Puedes crear tus propias directivas conBlade::directive():// En AppServiceProvider::boot() Blade::directive('datetime', function ($expression) { return "<?php echo ($expression)->format('d/m/Y H:i'); ?>"; }); <!-- Uso --> @datetime($post->created_at)
Ventajas de Blade
Seguridad: Escapa variables automáticamente.
Rendimiento: Las vistas son compiladas a código PHP y cacheadas.
Legibilidad: Sintaxis más clara que PHP puro en HTML.
Ejemplo Completo
<!-- resources/views/welcome.blade.php -->
@extends('layouts.app')
@section('title', 'Inicio')
@section('content')
<h1>Bienvenido, {{ Auth::user()->name }}</h1>
@include('partials.notification')
<ul>
@foreach($items as $item)
<li>{{ $item->name }}</li>
@endforeach
</ul>
@endsection1. @yield
¿Qué hace?
Define un "hueco" en una plantilla maestra (layout) que será rellenado por otras vistas.Ejemplo:
<!-- layout.blade.php (plantilla maestra) --> <head> <title>@yield('title')</title> <!-- Aquí irá el título --> </head><!-- vista_hija.blade.php --> @extends('layout') @section('title', 'Página de inicio') <!-- Rellena el hueco -->
2. @section + @endsection
¿Qué hace?
Define un bloque de contenido que puede ser inyectado en@yieldo usado con@parent(para añadir contenido a una sección existente).Ejemplo:
<!-- layout.blade.php --> <body> @yield('content') <!-- Aquí irá el contenido --> </body><!-- vista_hija.blade.php --> @section('content') <p>Este es el contenido principal.</p> @endsection
3. @stack + @push
¿Qué hace?
@stackdefine un lugar donde se apilarán múltiples bloques de contenido (como scripts o estilos), y@pushañade contenido a esa pila.Ejemplo:
<!-- layout.blade.php --> <head> @stack('scripts') <!-- Aquí se acumularán los scripts --> </head><!-- vista_hija.blade.php --> @push('scripts') <script>alert('Hola!');</script> @endpush
4. <x-slot> (en componentes)
¿Qué hace?
Permite pasar bloques de HTML a componentes de Blade. Es como un@sectionpero para componentes.Ejemplo:
<!-- Componente 'alert.blade.php' --> <div class="alert"> {{ $slot }} <!-- Aquí va el contenido por defecto --> <x-slot name="extra">Contenido extra</x-slot> </div><!-- Uso del componente --> <x-alert> Este es el contenido principal. <x-slot name="extra">Más info...</x-slot> </x-alert>
Resumen rápido:
@yield: "Hueco" en el layout.@section: Bloque de contenido para rellenar el hueco.@stack/@push: Para acumular cosas (como scripts).<x-slot>: Bloques de HTML en componentes.
1. Del Controlador a la Vista
El controlador envía datos a la vista usando el método view() junto con un array asociativo.
Ejemplo:
Controlador (TaskController.php)
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TaskController extends Controller
{
public function index()
{
// Datos que queremos pasar a la vista (ej: lista de tareas)
$tasks = [
'Lavar los platos',
'Hacer la compra',
'Estudiar Laravel'
];
// Pasamos las tareas a la vista 'tasks.index'
return view('tasks.index', ['tasks' => $tasks]);
}
}Vista (resources/views/tasks/index.blade.php)
<!DOCTYPE html>
<html>
<head>
<title>Lista de Tareas</title>
</head>
<body>
<h1>Mis Tareas</h1>
<ul>
@foreach($tasks as $task)
<li>{{ $task }}</li>
@endforeach
</ul>
</body>
</html>Resultado en el navegador:
Mis Tareas
- Lavar los platos
- Hacer la compra
- Estudiar Laravel2. De la Vista al Controlador (Formulario)
Para enviar datos desde la vista al controlador (ej: añadir una nueva tarea), usamos un formulario y recibimos los datos con $request.
Ejemplo:
Vista (resources/views/tasks/index.blade.php)
<!-- Añadimos un formulario para nuevas tareas -->
<form action="{{ route('tasks.store') }}" method="POST">
@csrf <!-- Token de seguridad -->
<input type="text" name="task" placeholder="Nueva tarea">
<button type="submit">Guardar</button>
</form>Ruta (routes/web.php)
use App\Http\Controllers\TaskController;
Route::get('/tasks', [TaskController::class, 'index'])->name('tasks.index');
Route::post('/tasks', [TaskController::class, 'store'])->name('tasks.store');Controlador (TaskController.php)
public function store(Request $request)
{
// Obtenemos la tarea enviada desde el formulario
$newTask = $request->input('task');
// Aquí podríamos guardarla en una base de datos, etc.
return redirect()->route('tasks.index')->with('success', 'Tarea añadida!');
}Resumen
✅ Controlador → Vista:
El controlador pasa datos con
return view('vista', ['clave' => $valor]).La vista los recibe como variables (ej:
$tasks).
✅ Vista → Controlador:
La vista envía datos mediante un formulario (POST/GET).
El controlador los recibe con
$request->input('nombre_campo').
¡Así de fácil! 😊 Con esto ya puedes enviar y recibir datos básicos en Laravel.
Componentes en Blade con Slots (Laravel)
Los componentes en Blade permiten crear elementos reutilizables. Los slots son espacios dentro del componente que pueden ser llenados con contenido personalizado cuando se usa el componente. Vamos a adaptar nuestro ejemplo de tareas.
1. Crear un componente simple (card)
Componente (resources/views/components/card.blade.php)
<div style="border: 1px solid #ccc; padding: 10px; margin: 10px;">
<h2>{{ $title }}</h2>
<div class="content">
{{ $slot }}
</div>
@isset($footer)
<div class="footer">
{{ $footer }}
</div>
@endisset
</div>2. Modificar la vista para usar componentes
Vista actualizada (resources/views/tareas/index.blade.php)
@extends('layouts.app')
@section('title', 'Lista de Tareas')
@section('content')
<x-card title="Gestión de Tareas">
<form method="POST" action="{{ route('tareas.store') }}">
@csrf
<input type="text" name="nombre" placeholder="Nueva tarea" required>
<button type="submit">Agregar</button>
</form>
<ul>
@foreach($tareas as $tarea)
<li>{{ $tarea->nombre }}</li>
@endforeach
</ul>
<x-slot name="footer">
Total: {{ count($tareas) }} tareas
</x-slot>
</x-card>
@endsectionExplicación de los elementos
Componente principal (
<x-card>)Se llama con
titlecomo atributoEl contenido entre las etiquetas va al
$slotprincipal
Slot principal (
$slot)Recibe todo el contenido interno automáticamente
En nuestro caso: el formulario y la lista
Slot con nombre (
footer)Definido con
<x-slot name="footer">Opcional (se verifica con
@isseten el componente)
Tipos de slots
| Tipo | Descripción | Ejemplo |
|---|---|---|
| Slot principal | Contenido por defecto | {{ $slot }} |
| Slot con nombre | Contenido específico | {{ $footer }} |
| Slot con atributos | Datos adicionales | {{ $user->name }} |
Beneficios de usar componentes
Reutilización: Puedes usar el componente card en cualquier vista
Consistencia: Mantiene el mismo estilo en toda la aplicación
Organización: Separa la lógica de presentación
Flexibilidad: Permite contenido dinámico con slots
Los componentes pueden ser aún más potentes cuando se combinan con:
Props (atributos)
Clases condicionales
Slots con datos
Componentes anónimos
El resto de la aplicación (rutas, controlador, modelo) sigue exactamente igual que en los ejemplos anteriores.
Comentarios
Publicar un comentario