3-1-Blade en Laravel
Conceptos clave
@extends : La vista hija dice "yo voy a usar un layout padre"
@section : Define un bloque de contenido (como un hueco o sección)
@yield : En el layout padre, muestra el contenido que la vista hija ponga en esa sección
@show : Muestra la sección (similar a @yield pero usada en el layout)
@extends : La vista hija dice "yo voy a usar un layout padre"
@section : Define un bloque de contenido (como un hueco o sección)
@yield : En el layout padre, muestra el contenido que la vista hija ponga en esa sección
@show : Muestra la sección (similar a @yield pero usada en el layout)
Con @show (tu código original):
@section('sidebar')
Este es mi master sidebar.
@showResultado si la hija NO define 'sidebar': Muestra "Este es mi master sidebar."
@section('sidebar')
Este es mi master sidebar.
@showSin @show (usando @yield):
@yield('sidebar')
@yield('sidebar')Tu ejemplo (layout padre)
<!-- resources/views/layouts/master.blade.php -->
<html>
<head>
<title>@yield('title', 'Título por defecto')</title>
</head>
<body>
@section('sidebar')
Este es mi master sidebar.
@show
<div class="container">
@yield('content')
</div>
</body>
</html>
<!-- resources/views/layouts/master.blade.php -->
<html>
<head>
<title>@yield('title', 'Título por defecto')</title>
</head>
<body>
@section('sidebar')
Este es mi master sidebar.
@show
<div class="container">
@yield('content')
</div>
</body>
</html>Ejemplo aún más pequeño (3 líneas)
Layout padre (layout.blade.php):
<html>
<body>
@yield('contenido')
</body>
</html>Vista hija (home.blade.php):
@extends('layout')
@section('contenido')
<h1>Hola Mundo!</h1>
@endsectionResultado final:
<html>
<body>
<h1>Hola Mundo!</h1>
</body>
</html>
<html>
<body>
@yield('contenido')
</body>
</html>@extends('layout')
@section('contenido')
<h1>Hola Mundo!</h1>
@endsection<html> <body> <h1>Hola Mundo!</h1> </body> </html>
Ejemplo práctico con tu código
Layout padre - layouts/app.blade.php:
<html>
<head>
<title>Mi App - @yield('title')</title>
</head>
<body>
<nav>Menú principal</nav>
@section('sidebar')
<aside>Sidebar por defecto</aside>
@show
<main>
@yield('content')
</main>
<footer>© 2026</footer>
</body>
</html>Vista hija - productos/index.blade.php:
@extends('layouts.app')
@section('title', 'Lista de productos')
@section('sidebar')
<aside>
<h3>Filtros</h3>
<ul>
<li>Electrónica</li>
<li>Ropa</li>
</ul>
</aside>
@endsection
@section('content')
<h1>Productos</h1>
<ul>
<li>Laptop - $1000</li>
<li>Mouse - $20</li>
</ul>
@endsectionResultado final renderizado:
<html>
<head>
<title>Mi App - Lista de productos</title>
</head>
<body>
<nav>Menú principal</nav>
<aside>
<h3>Filtros</h3>
<ul>
<li>Electrónica</li>
<li>Ropa</li>
</ul>
</aside>
<main>
<h1>Productos</h1>
<ul>
<li>Laptop - $1000</li>
<li>Mouse - $20</li>
</ul>
</main>
<footer>© 2026</footer>
</body>
</html>
layouts/app.blade.php:<html>
<head>
<title>Mi App - @yield('title')</title>
</head>
<body>
<nav>Menú principal</nav>
@section('sidebar')
<aside>Sidebar por defecto</aside>
@show
<main>
@yield('content')
</main>
<footer>© 2026</footer>
</body>
</html>productos/index.blade.php:@extends('layouts.app')
@section('title', 'Lista de productos')
@section('sidebar')
<aside>
<h3>Filtros</h3>
<ul>
<li>Electrónica</li>
<li>Ropa</li>
</ul>
</aside>
@endsection
@section('content')
<h1>Productos</h1>
<ul>
<li>Laptop - $1000</li>
<li>Mouse - $20</li>
</ul>
@endsection<html> <head> <title>Mi App - Lista de productos</title> </head> <body> <nav>Menú principal</nav> <aside> <h3>Filtros</h3> <ul> <li>Electrónica</li> <li>Ropa</li> </ul> </aside> <main> <h1>Productos</h1> <ul> <li>Laptop - $1000</li> <li>Mouse - $20</li> </ul> </main> <footer>© 2026</footer> </body> </html>
Diferencia clave
<!-- En el LAYOUT -->
@section('sidebar') <!-- Define la sección -->
Contenido por defecto
@show <!-- La muestra inmediatamente -->
<!-- En el LAYOUT también puedes usar -->
@yield('sidebar') <!-- Solo muestra lo que la vista hija ponga -->
<!-- En el LAYOUT -->
@section('sidebar') <!-- Define la sección -->
Contenido por defecto
@show <!-- La muestra inmediatamente -->
<!-- En el LAYOUT también puedes usar -->
@yield('sidebar') <!-- Solo muestra lo que la vista hija ponga -->Regla de oro
@yield : Usa en layout cuando solo quieras mostrar contenido de la vista hija
@section + @show : Usa en layout cuando quieras un contenido por defecto que la hija pueda sobrescribir
@yield : Usa en layout cuando solo quieras mostrar contenido de la vista hija
@section + @show : Usa en layout cuando quieras un contenido por defecto que la hija pueda sobrescribir
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.
1. Sintaxis Básica de Blade
A. Mostrar Variables
{{ $variable }} // Escapa HTML automáticamente
{!! $html !!} // Sin escape (para HTML seguro)B. Estructuras de Control
Condicionales
@if($condition)
// Contenido
@elseif($anotherCondition)
// Contenido
@else
// Contenido
@endif
@unless($condition) // Equivalente a if(!$condition)
// Contenido
@endunlessBucles
@for($i = 0; $i < 10; $i++)
// Contenido
@endfor
@foreach($items as $item)
{{ $item->name }}
@endforeach
@forelse($items as $item) // Maneja arrays vacíos
{{ $item->name }}
@empty
<p>No hay items</p>
@endforelse2. Layouts y Herencia
A. Layout Principal (layouts/app.blade.php)
<!DOCTYPE html>
<html>
<head>
<title>@yield('title')</title>
@stack('styles') <!-- Para CSS específico -->
</head>
<body>
@include('partials.header')
<div class="content">
@yield('content')
</div>
@include('partials.footer')
@stack('scripts') <!-- Para JS específico -->
</body>
</html>B. Vista que Extiende el Layout
@extends('layouts.app')
@section('title', 'Página de Inicio')
@section('content')
<h1>Contenido Principal</h1>
@endsection
@push('scripts')
<script src="/custom.js"></script>
@endpush3. Componentes en Blade
A. Crear un Componente
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)
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)
<div class="alert alert-{{ $type }}">
{{ $slot }} <!-- Contenido pasado al componente -->
</div>D. Uso del Componente
<x-alert type="success">
¡Operación exitosa!
</x-alert>E. Componentes con Slots Nombrados
<!-- 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
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
@datetime($post->created_at)5. Includes y Fragmentos
A. Incluir Sub-vistas
@include('partials.header', ['title' => 'Inicio'])B. Fragmentos Reutilizables
<!-- 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
| Característica | Blade Clásico | Componentes |
|---|---|---|
| Reutilización | @include o @extends | Clases + plantillas encapsuladas |
| Lógica | Directivas simples | Lógica PHP en clases |
| Props | Variables pasadas manualmente | Props declaradas en clase |
| Slots | No nativo | Slots y slots nombrados |
| Rendimiento | Ligero | Optimizado con caché |
7. Consejos Avanzados
Atributos Dinámicos:
<x-button {{ $attributes->merge(['class' => 'btn']) }}>Componentes Anónimos (Laravel 8+):
php artisan make:component forms.input --inlineAcceder a Atributos:
{{ $attributes->get('class') }}
8. Ejemplo Completo: Sistema de Notificaciones
Componente (Notification.php)
public $type;
public $message;
public function __construct($type = 'info', $message = '')
{
$this->type = $type;
$this->message = $message;
}Vista (notification.blade.php)
<div class="notification notification-{{ $type }}">
{{ $message ?? $slot }}
</div>Uso
<x-notification type="error" message="Error crítico"/>
<!-- O -->
<x-notification type="success">
Registro completado!
</x-notification>Documentación Oficial:
Con esta guía dominarás Blade y componentes para crear vistas mantenibles y escalables en Laravel. ¡A codear! 🚀
Comentarios
Publicar un comentario