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)

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)

Directiva

Uso en el layout

@yield('sidebar')

Muestra únicamente el contenido que la vista hija defina en @section('sidebar'). Si la hija no lo define, no muestra nada.

@section('sidebar') ... @show

Define un contenido por defecto que se mostrará a menos que la vista hija lo sobrescriba con su propio @section('sidebar').

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>

B. Vista que Extiende el Layout

php

Copy

Download

@extends('layouts.app')


@section('title', 'Página de Inicio')


@section('content')

    <h1>Contenido Principal</h1>

@endsection


@push('scripts')

    <script src="/custom.js"></script>

@endpush



Comentarios

Entradas más populares de este blog

02 -Rutas en Laravel

01-04-convencion nombres

3-Rutas