Las vistas en php se pueden construir mezclando php y html.
Ese código híbrido puede resultar muy espeso y difícil de entender.
Por ese motivo se ha extendido el uso de motores de plantillas que facilitan la inclusión de contenido variable en nuestro html.
Motores de plantillas son:
Blade, usado por Laravel
Smarty, muy habitual, no ceñido a ningún framework
Twig, usado por Simphony.
Los motores de plantillas usan un código más limpio. Dicho código se compila de forma transparente al usuario y se genera php como estamos acostumbrados.
plantilla + compilación transparente = html + php
Mostrar una vista.
Las vistas en Laravel pueden usar php o el motor blade. El nombre del fichero nos indica cómo hemos construido una vista. Hemos de respetar esta convención para que blade funcione.
nombrevista.php
nombrevista.blade.php
Desde nuestro fichero de rutas podemos llamar a una vista. Veremos que también lo podemos hacer desde los controladores.
Las vistas se guardan en /resources/views
Route::get('user', function()
{
//mostraremos user.php o user.blade.php
return view('user');
});
Es conveniente usar subdirectorios. No obstante al llamarlas podemos usar barras o puntos para referirnos a ellas.
La vista guardada en user/index.blade.php se puede llamar indistintamente así:
Route::get('user', function()
{
return view('user/index');
return view('user.index');
});
Pasar variables a la vista
Para llevar variables a la vista debemos hacer lo siguiente:
El método más básico que tenemos en Blade es el de mostrar datos, para esto utilizaremos las llaves dobles ({{ }}) y dentro de ellas escribiremos la variable o función con el contenido a mostrar:
Hola {{ $name }}.
La hora actual es {{ time() }}.
Como hemos visto podemos mostrar el contenido de una variable o incluso llamar a una función para mostrar su resultado. Blade se encarga de escapar el resultado llamando a htmlentities para prevenir errores y ataques de tipo XSS. Si en algún caso no queremos escapar los datos tendremos que usar {!! !!} en vez de {{ }}:
Hola {!! $name !!}.
Nota: En general siempre tendremos que usar las llaves dobles, en especial si vamos a mostrar datos que son proporcionados por los usuarios de la aplicación. Esto evitará que inyecten símbolos que produzcan errores o inyecten código javascript que se ejecute sin que nosotros queramos. Por lo tanto, este último método solo tenemos que utilizarlo si estamos seguros de que no queremos que se escape el contenido.
Mostrar un dato sólo si existe
Para comprobar que una variable existe o tiene un determinado valor podemos utilizar el operador ternario de la forma:
{{ isset($name) ? $name : 'Valor por defecto' }}
O simplemente usar la notación que incluye Blade para este fin:
{{ $name or 'Valor por defecto' }}
Comentarios
Para escribir comentarios en Blade se utilizan los símbolos {{-- y --}}, por ejemplo:
{{-- Este comentario no se mostrará en HTML --}}
Pasar información
Lo habitual es pasar información a la plantilla para que se genere una vista realmente dinámica. Para hacerlo usando un array asociativo (clave-valor).
En Blade podemos indicar que se incluya una plantilla dentro de otra plantilla, para esto disponemos de la instrucción @include:
@include('view_name')
Además podemos pasarle un array de datos a la vista a cargar usando el segundo parámetro del método include:
@include('view_name', array('some'=>'data'))
Esta opción es muy útil para crear vistas que sean reutilizables o para separar el contenido de una vista en varios ficheros.
Layouts
Resulta interesante poder unificar la construcción de nuestras vistas.
Podemos usar la directiva include para incluir elementos construidos en un fichero a parte.
@include('footer')
//así incluiremos un elemento guardado en views directamente y con extensión php o blade.php
Pero lo realmente práctico es usar layouts. Un layout es una plantilla con la distribución base para otras plantillas. La ubicación está en /resources/views/layouts
Un fichero de layout es un fichero blade normal con la salvedad de usar algunas directivas que etiquetan la ubicación de los elementos a construir en cada una de las vistas que usen ese layout.
Los elementos variables de nuestras vistas se definen con las directivas @section y sus posibles cierres (@endsection|stop|show|append ) y @yield
Section define una sección.
Si se cierra con @endsection o @stop (equivalentes) se define la sección pero hay que usar @yield después para definir su ubicación en el layout.
Si usamos @yield ubicamos una sección si ya estaba definida. Si la sección no existe se crea y se ubica.
La diferencia principal entre @section y @yield es que la primera permite añadir contenido a una sección y la segunda no.
Si @section se cierra con @show se define además el punto de inserción
Ejemplo de una plantilla tipo layout almacenada en el fichero resources/views/layouts/master.blade.php:
<html>
<head>
<title>Mi Web</title>
</head>
<body>
@section('menu')
Contenido del menu
@show
<div class="container">
@yield('content')
</div>
</body>
</html>
Posteriormente, en otra plantilla o vista, podemos indicar que extienda el layout que hemos creado (con @extends('layouts.master')) y que complete las dos secciones de contenido que habíamos definido en el mismo:
@extends('layouts.master')
@section('menu')
@parent
<p>Este condenido es añadido al menú principal.</p>
@endsection
@section('content')
<p>Este apartado aparecerá en la sección "content".</p>
@endsection
Como se puede ver, las vistas que extienden un layout simplemente tienen que sobrescribir las secciones del layout.
La directiva @section permite ir añadiendo contenido en las plantillas hijas, mientras que @yield será sustituido por el contenido que se indique.
El método @parent carga en la posición indicada el contenido definido por el padre para dicha sección.
El método @yield también permite establecer un contenido por defecto mediante su segundo parámetro:
@yield('section', 'Contenido por defecto')
Otro ejemplo
<!-- Stored in resources/views/layouts/app.blade.php -->