Blade: El motor de plantillas de Laravel 5

Blade es un simple y potente motor de plantillas implementado en Laravel. No te restringe a utilizar PHP como lenguaje predeterminado para crear tus vistas, sino que aporta una serie de comandos que Laravel entiende y traduce. Todas las vistas de Blade son compiladas a PHP, lo que significa que Blade no satura con sobre-código tu aplicación.

Como ya vimos, las vistas en Blade contienen la extensión .blade.php y normalmente se guardan en el directorio resources/views.

Salida PHP

Para mostrar salidas simples por pantallas en PHP nos valemos de la función echo(), pero podríamos transformarlo a algo más sencillo. Blade utiliza {{ }} (las dobles llaves) para hacer una salida, independientemente del código PHP que sea, incluso métodos.

{{ "Hoy es el día " . date('d-m-Y') }}

O también podemos mostrar variables que hayamos recogido

{{ "Así que, tu nombre es " . $name }}

Estructuras de control

A estas alturas todo el mundo conoce ya como funcionan o como usar las estructuras de control. Algo que en PHP llano y sonante parece algo también bastante largo de codificar si se tercia. Por eso Blade establece un modo más limpio.

IF

<?php $records = 1; ?>
@if (count($records) === 1)
    I have one record!
@elseif (count($records) > 1)
    I have multiple records!
@else
    I don't have any records!
@endif

Además Blade pone a disposición @unless()...@endunless, @isset()...@endisset y @empty()...@endempty

LOOPS

@for ($i = 0; $i < 10; $i++)
    The current value is {{ $i }}
@endfor

@foreach ($users as $user)
    <p>This is user {{ $user->id }}</p>
@endforeach

@while (true)
    <p>I'm looping forever.</p>
@endwhile

COMENTARIOS

Para hacer comentarios en Blade las dobles llaves llegan a incluir dos guiones:

{{-- Esto es un comentario --}}

Plantillas

Incluir plantillas en otras

@include('header')

Aquí viene el contenido de "home"

@include('footer')

La directiva @include llama a otra plantilla distinta para incluirla en la actual. Las llamadas a las plantillas se hacen entre comillas. Y la directiva @include no tiene cierre.

Podemos además, llamar a sub-vistas. Es decir, si tenemos una estructura de vistas organizadas por directorios, podemos invocarlas separando los directorios por (.)

{{-- header.blade.php está dentro de resources/views/layouts --}}
@include('layouts.header')

{{-- sidebar.blade.php está en la raíz de resources/views/ --}}
@include('sidebar')

@include('layouts.footer')

Plantillas

Definir una plantilla

Dos de las principales ventajas de usar Blade son las herenciassecciones. Si partimos de que la estructura de la web tiene partes claramente iguales en todas las páginas, siempre será conveniente partir de una matriz:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>@yield('title')</title>
</head>
<body>
  @section('nav')
    <!-- aquí viene tu menú de navegación -->
  @show
  <div class="container">
    @yield('content')
  </div>
</body>
</html>

Analicemos los tres elementos que hemos introducido para Blade. Primero los campos @yield(‘title’) y @yield(‘body’), son unas secciones en las que podremos introducir contenido más adelante y el otro campo @section(‘sidebar’) ya es un campo en el que hemos introducido cierto contenido que se mostrará sin ninguna sección hija que se ejecute después.

Ahora montemos nuestra receptora de la plantilla padre. Que como se ha dicho anteriormente, obligatoriamente debe extender de una plantilla base si queremos que recoja todas las demás etiquetas.

Extender plantillas

Cuando definimos una plantilla hija que va a heredar de una padre se usará la directiva @extends(). Hay que ubicar correctamente la ruta hasta la plantilla.

Para las llamadas a lo que en la plantilla maestra eran @yield, ahora las ejecutamos con la directiva @section(). Podemos pasar un segundo parámetro para el caso del título de la página, que será una cadena de texto.

Y para mostrar lo que eran @section() ya ejecutable en la plantilla maestra, simplemente ejecutamos la sentencia @parent.

@extends('layouts.app')

@section('title', 'Inicio')

@section('nav')
    @parent

    <p>Esto se ve después de la master.</p>
@endsection

@section('content')
    <p>Este es el cuerpo del contenido.</p>
@endsection

Con esto ya podemos montar nuestras plantillas que hereden de contenido idéntico y un aspecto más depurado a las vistas de Laravel.

Deja un comentario