En este post voy a dar una introducción a cómo renderizar y mostrar vistas en el framework de Laravel. Será con la versión 5.8 pero aplica a casi todas las versiones actuales.
Lo que veremos será:
- Cómo crear vistas
- Ubicación de las vistas
- Pasar datos a las vistas
- Definir layouts o plantillas base
- Fomentar la reutilización de plantillas
Recuerda que ya vimos:
Cómo comenzar un proyecto de Laravel
Actualizar Laravel a versión 5.8
Comencemos.
El motor de plantillas Blade
Laravel utiliza el motor de Blade. Es un motor robusto, con protección contra ataques XSS y que compila el código a PHP nativo.
Ubicación de las vistas
Las vistas en Laravel están ubicadas en resources/views. Dentro de esa carpeta podemos ubicar las vistas directamente, o crear subcarpetas para tener una mejor organización.
Si te fijas bien, tienen la extensión .blade.php. Dentro de ellas defines el código HTML.
Por cierto, en los siguientes ejemplos vamos a renderizar pasando simplemente el nombre de la vista, sin extensiones:
view("nombre_de_la_vista")
Si organizas tus vistas en distintas carpetas, usa el punto para separar:
view("usuarios.mostrar")
También puedes usar la barra:
view("usuarios/mostrar")
Contenido de una vista
Para renderizar se utilizan los mostachos (bueno, no sé si se les dice así pero se parecen a unos mostachos) que en realidad son pares de llaves:
{{expresión}}
Como lo dije, automáticamente se previenen ataques XSS y no se imprime directamente código HTML dentro de la expresión.
Si quieres mostrar contenido HTML y exponerte a ataques XSS usa un signo de admiración:
{!! expresión !!}
Ejemplo de una vista
Veamos una simple vista:
<!DOCTYPE html>
<html lang="es">
<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>Yo soy el título</title>
</head>
<body>
<p>
Aquí vive el código HTML
</p>
<h2>Pero puede ser combinado con Blade:</h2>
<p>
¿Cuánto es 5 + 5? {{5 + 5}}
<br>
Tiempo actual: {{time()}}
<br>
Podemos llamar a funciones nativas: {{ucwords('hola')}}
</p>
</body>
</html>
Dentro de ella vamos a renderizar algunas cosas que podríamos hacer con PHP pero de una forma más elegante. También podríamos mostrar variables con:
{{$variable}}
Igualmente se pueden hacer ciclos, condicionales y eso pero lo veremos en otro post cuando analicemos Blade.
En la vista llamamos a la función time, mostramos el resultado de una suma y mostramos un mensaje con la primera letra mayúscula.
Pasar datos a vistas
Para pasar datos de las vistas normalmente definimos una ruta que llame a un controlador. Por ejemplo:
Route::get("usuarios", "UsuariosController@mostrar");
La vista será la siguiente:
<!DOCTYPE html>
<html lang="es">
<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>{{$titulo}}</title>
</head>
<body>
<h1>Aquí renderizamos los datos pasados por el controlador</h1>
@foreach($usuarios as $usuario)
<p>{{$usuario}}</p>
@endforeach
</body>
</html>
Desde el controlador pasamos los datos llamando a with, pasándole un arreglo en donde las claves serán los nombres de las variables desde las vistas.
El contenido del método mostrar del controlador es el siguiente:
<?php
namespace App\Http\Controllers;
class UsuariosController extends Controller
{
public function mostrar(){
return view("usuarios")
->with([
"usuarios" => [
"Luis",
"Maggie",
"Raúl"
],
"titulo" => "Soy un título"
]);
}
}
Dentro de las vistas accedemos a los datos. Como se observa, se pueden pasar arreglos y todo tipo de datos. En la vista hacemos un foreach para recorrer el arreglo, lo cual es una directiva de Blade.
La salida es la siguiente:
E igualmente podríamos pasar otros datos traídos desde el almacenamiento de la aplicación o cualquier otro lugar.
Alternativa para pasar datos
Si los datos no son muchos, podríamos llamar a Route::view y mandar un tercer argumento:
Route::view("urlVisitada", "nombreDeVista", ["titulo" => "Soy un título"]);
Layouts y plantillas base
Con Blade y Laravel la reutilización de plantillas, la creación de componentes y la definición de layouts base son unas cosas muy fáciles de lograr.
Por ejemplo, tenemos una plantilla base o maestra:
<!DOCTYPE html>
<html lang="es">
<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("titulo")</title>
<style>
/*
Poner bordes a las tablas. Tomado de:
Ejemplo de tabla en HTML con bordes CSS
*/
table {
border-collapse: collapse;
}
table,
th,
td {
border: 1px solid black;
}
th,
td {
padding: 5px;
}
</style>
</head>
<body>
<a href="{{route('inicio')}}">Inicio</a>
<a href="{{route('formAgregar')}}">Agregar</a>
@yield("contenido")
<hr>
<p>
CRUD de MySQL con Laravel. Creado por <a href="//parzibyte.me">parzibyte</a>
</p>
</body>
</html>
Hay que fijarnos en las directivas de yield. Tenemos dos:
- El título
- El contenido
Más tarde extendemos de esta vista (usando extends e indicando el nombre de la plantilla que extendemos):
@extends("principal")
@section("titulo", "Agregar canción")
@section("contenido")
<h1>Agregar canción</h1>
<form method="POST" action="{{ route('agregarCancion') }}">
@csrf
<input autocomplete="off" required type="text" name="nombre" placeholder="Nombre de la canción">
<br><br>
<input autocomplete="off" required type="text" name="artista" placeholder="Artista que la canta">
<br><br>
<input autocomplete="off" required type="text" name="album" placeholder="Álbum">
<br><br>
<input autocomplete="off" required type="number" name="anio" placeholder="Año">
<br><br>
<input type="submit" value="Guardar">
</form>
@endsection
Para remplazar el título, llamamos a @section
. Luego, como el contenido es más grande, definimos un fragmento de sección y dentro ponemos lo que irá en el body
.
El código HTML resultante es este:
<!DOCTYPE html>
<html lang="es">
<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>Agregar canción</title>
<style>
/*
Poner bordes a las tablas. Tomado de:
Ejemplo de tabla en HTML con bordes CSS
*/
table {
border-collapse: collapse;
}
table,
th,
td {
border: 1px solid black;
}
th,
td {
padding: 5px;
}
</style>
</head>
<body>
<a href="http://localhost/crud-laravel-mysql/public">Inicio</a>
<a href="http://localhost/crud-laravel-mysql/public/agregar">Agregar</a>
<h1>Agregar canción</h1>
<form method="POST" action="http://localhost/crud-laravel-mysql/public/agregar">
<input type="hidden" name="_token" value="WZk5RjmAuNQfwQcxpgR0OGbjpe5EENlPZv9AlMY4"> <input autocomplete="off" required type="text" name="nombre" placeholder="Nombre de la canción">
<br><br>
<input autocomplete="off" required type="text" name="artista" placeholder="Artista que la canta">
<br><br>
<input autocomplete="off" required type="text" name="album" placeholder="Álbum">
<br><br>
<input autocomplete="off" required type="number" name="anio" placeholder="Año">
<br><br>
<input type="submit" value="Guardar">
</form>
<hr>
<p>
CRUD de MySQL con Laravel. Creado por <a href="//parzibyte.me">parzibyte</a>
</p>
</body>
</html>
Sin fijarnos en otras cosas como el token CSRF o las URL, vemos que tomó la plantilla maestra y mostró el título y contenido.
Gracias a esto podemos fomentar la reutilización de plantillas y la separación de componentes.
Te invito a ver más tutoriales de Laravel.
Pingback: Declarar variable de PHP en vista de Blade con Laravel - Parzibyte's blog
Pingback: Blade y Laravel: ciclos, condicionales, token CSRF y componentes - Parzibyte's blog