02-01-vistas
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)
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
Con @show (tu código original):
blade
@section('sidebar')
Este es mi master sidebar.
@show
Resultado si la hija NO define 'sidebar': Muestra "Este es mi master sidebar."
Sin @show (usando @yield):
@yield('sidebar')
Ejemplo aún más pequeño (3 líneas)
Layout padre (layout.blade.php):
blade
<html>
<body>
@yield('contenido')
</body>
</html>
Vista hija (home.blade.php):
blade
@extends('layout')
@section('contenido')
<h1>Hola Mundo!</h1>
@endsection
Resultado final:
html
<html>
<body>
<h1>Hola Mundo!</h1>
</body>
</html>
1. Layout padre – layouts/app.blade.php (sin cambios)
<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>
2. Vista hija – tareas/index.blade.php (ahora sin @php)
@extends('layouts.app')
@section('title', 'Lista de tareas')
@section('sidebar')
<aside>
<h3>Filtros</h3>
<ul>
<li>Pendientes</li>
<li>Completadas</li>
</ul>
</aside>
@endsection
@section('content')
<h1>Lista de tareas</h1>
<ul>
@foreach ($tareas as $tarea)
<li>{{ $tarea['nombre'] }} (ID: {{ $tarea['id'] }})</li>
@endforeach
</ul>
@endsection
Nota: Ahora la vista espera que la variable $tareas exista en el entorno de renderizado.
3. Resultado final renderizado (idéntico al anterior)
html
<html>
<head>
<title>Mi App - Lista de tareas</title>
</head>
<body>
<nav>Menú principal</nav>
<aside>
<h3>Filtros</h3>
<ul>
<li>Pendientes</li>
<li>Completadas</li>
</ul>
</aside>
<main>
<h1>Lista de tareas</h1>
<ul>
<li>Comprar pan (ID: 1)</li>
<li>Estudiar Laravel (ID: 2)</li>
<li>Hacer ejercicio (ID: 3)</li>
</ul>
</main>
<footer>© 2026</footer>
</body>
</html>
5. Diferencia clave (repaso)
En nuestro ejemplo, usamos @section ... @show en el layout, y la vista hija lo sobrescribe con su propio sidebar de filtros. Si no lo sobrescribiera, veríamos el texto "Sidebar por defecto".
6. Ejemplo adicional: pasar el arreglo directamente desde la ruta sin variable intermedia (solo por curiosidad)
También puedes pasar los datos usando view() con un arreglo asociativo en el segundo parámetro:
Route::get('/tareas', function () {
return view('tareas.index', [
'tareas' => [
['id' => 1, 'nombre' => 'Comprar pan'],
['id' => 2, 'nombre' => 'Estudiar Laravel'],
['id' => 3, 'nombre' => 'Hacer ejercicio'],
]
]);});
El resultado en la vista será el mismo, porque $tareas estará disponible
Diferencia clave
blade
<!-- 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 -->
1. Sintaxis Básica de Blade
A. Mostrar Variables
php
Copy
Download
{{ $variable }} // Escapa HTML automáticamente
{!! $html !!} // Sin escape (para HTML seguro)
B. Estructuras de Control
Condicionales
php
Copy
Download
@if($condition)
// Contenido
@elseif($anotherCondition)
// Contenido
@else
// Contenido
@endif
@unless($condition) // Equivalente a if(!$condition)
// Contenido
@endunless
Bucles
php
Copy
Download
@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>
@endforelse
2. Layouts y Herencia
A. Layout Principal (layouts/app.blade.php)
php
Copy
Download
<!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>
Comentarios
Publicar un comentario