Laravel 5
Laravel 5
Tabla de contenido
Contenidos 0
Introduccin 1
Captulo 1. Primeros pasos 2
Instalacin 2.1
Funcionamiento bsico 2.2
Rutas 2.3
Artisan 2.4
Vistas 2.5
Plantillas mediante Blade 2.6
Ejercicios 2.7
Captulo 2. Controladores, middleware y formularios 3
Controladores 3.1
Middleware o filtros 3.2
Rutas avanzadas 3.3
Redirecciones 3.4
Formularios 3.5
Ejercicios 3.6
Captulo 3. Base de datos 4
Configuracin inicial 4.1
Migraciones 4.2
Schema Builder 4.3
Inicializacin de la BD 4.4
Constructor de consultas 4.5
Eloquent ORM 4.6
Ejercicios 4.7
Captulo 4. Datos de entrada y control de usuarios 5
Datos de entrada 5.1
Control de usuarios 5.2
Ejercicios 5.3
Captulo 5. Paquetes, Rest y Curl 6
2
Laravel 5
3
Laravel 5
Contenidos
En este libro se ve una introduccin al framework de desarrollo Web Laravel. Se parte de
los conceptos ms bsicos: introduccin, instalacin, estructura de un proyecto, ejemplos
sencillos de uso, etc. Pero se llegan a ver aspectos ms avanzados como es el uso de base
de datos, el control de usuarios o la creacin de una API.
Para la lectura de este manual es necesario tener conocimientos sobre HTML, CSS,
Javascript y PHP, ya que todos ellos se dan por sabidos.
A continuacin se muestra un detalle del contenido de los captulos en los que se divide el
libro:
Introduccin
Qu es Laravel?
MVC: Modelo - Vista - Controlador
Novedades en la versin 5
Captulo 1 - Primeros pasos
Instalacin
Funcionamiento bsico
Rutas: definicin, parmetros y generacin
Artisan
Vistas: definicin, uso y paso de datos
Plantillas mediante Blade
Ejercicios
Captulo 2 - Controladores, filtros y formularios
Controladores
Middleware o filtros
Rutas avanzadas
Redirecciones
Formularios
Ejercicios
Captulo 3 - Base de datos
Configuracin
Migraciones
Schema Builder
Inicializacin de la BD
Constructor de consultas
Eloquent ORM
Contenidos 4
Laravel 5
Ejercicios
Captulo 4 - Datos de entrada y Control de Usuarios
Datos de entrada
Control de usuarios
Ejercicios
Captulo 5 - Paquetes, Rest y Curl
Instalacin de paquetes adicionales
Controladores de recursos RESTful
Probar una API con cURL
Autenticacin HTTP bsica
Respuestas especiales
Ejercicios
Contenidos 5
Laravel 5
Introduccin
Qu es Laravel?
Laravel es un framework de cdigo abierto para el desarrollo de aplicaciones web en PHP 5
que posee una sintaxis simple, expresiva y elegante. Fue creado en 2011 por Taylor Otwell,
inspirndose en Ruby on Rails y Symfony, de los cuales ha adoptado sus principales
ventajas.
Esta diseado para desarrollar bajo el patrn MVC (modelo - vista - controlador),
centrndose en la correcta separacin y modularizacin del cdigo. Lo que facilita el
trabajo en equipo, as como la claridad, el mantenimiento y la reutilizacin del cdigo.
Integra un sistema ORM de mapeado de datos relacional llamado Eloquent aunque
tambin permite la construccin de consultas directas a base de datos mediante su
Query Builder.
Permite la gestin de bases de datos y la manipulacin de tablas desde cdigo,
manteniendo un control de versiones de las mismas mediante su sistema de
Migraciones.
Utiliza un sistema de plantillas para las vistas llamado Blade, el cual hace uso de la
cache para darle mayor velocidad. Blade facilita la creacin de vistas mediante el uso
de layouts, herencia y secciones.
Facilita la extensin de funcionalidad mediante paquetes o libreras externas. De esta
forma es muy sencillo aadir paquetes que nos faciliten el desarrollo de una aplicacin
y nos ahorren mucho tiempo de programacin.
Incorpora un intrprete de lnea de comandos llamado Artisan que nos ayudar con un
montn de tareas rutinarias como la creacin de distintos componentes de cdigo,
trabajo con la base de datos y migraciones, gestin de rutas, cachs, colas, tareas
Introduccin 6
Laravel 5
programadas, etc.
Introduccin 7
Laravel 5
Novedades en la versin 5
En Laravel 5 se han incluido un montn de novedades y cambios con respecto a la versin
anterior. Si vienes de la versin 4 y quieres actualizar tus proyectos a la nueva versin
puedes seguir la gua de actualizacin de su pgina: http://laravel.com/docs/5.1/upgrade.
Segn el proyecto, en ocasiones ser ms sencillo empezar desde cero y trasladar el
cdigo que modificar el proyecto anterior. Si seguimos la gua podremos actualizar nuestros
proyectos pero es recomendable que antes revises toda la nueva documentacin ya que
hay muchas nuevas funcionalidades que podemos aprovechar.
Introduccin 8
Laravel 5
Adems, en la nueva versin de Laravel se han adoptado dos nuevos estndares: PSR-4
(http://www.php-fig.org/psr/psr-4/) para la carga automtica de clases a partir de su ruta de
archivos, y PSR-2 (http://www.php-fig.org/psr/psr-2/) como gua de estilo del cdigo fuente.
Introduccin 9
Laravel 5
Captulo 1.
Primeros pasos
En este primer captulo vamos a dar los primeros pasos en el mundo Laravel.
Aprenderemos desde como instalar un servidor Web, como crear nuestro primer proyecto y
configurarlo, y llegaremos a ver algunas de las funcionalidades principales de este
framework para ser capaces de crear nuestra primera Web.
Instalacin de Laravel
Para la utilizacin de Laravel en primer lugar necesitamos tener instalado un servidor Web
con PHP >= 5.5.9, MySQL y la extensin MCrypt de PHP. Una vez instalado el servidor
procederemos a instalar la utilidad Composer y por ltimo la librera de Laravel. A
continuacin se describen los pasos a seguir.
Esto descargar una imagen tipo DMG (en el caso de Mac), hacemos doble clic encima
para iniciar el proceso de instalacin.
Con esto ya tenemos un servidor Web instalado en nuestro ordenador. Ahora para iniciarlo
y pararlo solo tendremos que acceder a su Panel de Control e iniciar o parar Apache y
MySQL. El nombre de la aplicacin de Panel de Control de XAMPP es "manager-osx".
Desde este mismo panel de control, adems de poder iniciar o parar los servicios, podemos
ver el log, abrir la carpeta de disco donde tenemos que almacenar nuestro proyectos Web
(por defecto situada en /Applications/XAMPP/htdocs ) o abrir la URL de nuestro servidor web
en un navegador (http://localhost/xampp/).
http://localhost
Esto nos mostrar la pgina por defecto de XAMPP, que contiene algunos links para
comprobar el estado del software instalado y algunos ejemplos de programacin.
Instalacin 11
Laravel 5
Instalacin de Composer
Composer es un gestor de dependencias para PHP. Esto quiere decir que permite
descargar de sus repositorios todas las libreras y las dependencias con las versiones
requeridas que el proyecto necesite.
Instalar Composer es muy sencillo por linea de comandos. Si accedemos a su pgina web
en "https://getcomposer.org/" podemos consultar las instrucciones, simplemente tendremos
que hacer:
Instalacin 12
Laravel 5
$ composer
Esto nos descargar la ltima versin de Laravel y crear una carpeta llamada miweb con
todo el contenido ya preparado. Si nos apareciera algn error de permisos tendramos que
ejecutar de nuevo el mismo comando pero con sudo .
Instalacin de Mcrypt
Para instalar Mcrypt seguiremos los siguientes pasos:
Ejecutamos which php para comprobar la ruta del php utilizado, la cual deber ser
( /usr/bin/php ).
A continuacin escribimos:
Instalacin 13
Laravel 5
PATH="/Applications/XAMPP/xamppfiles/bin:$PATH"
Y por ltimo presionamos Ctrl+O para guardar los cambios y Ctrl-X para salir.
Con esto hemos aadido al PATH del sistema la ruta de los ejecutables que incorpora
XAMPP, entre los cuales se incluye Mcrypt. Para que se actualice el PATH cerramos el
terminal actual y volvemos a abrir uno. Ahora si escribimos otra vez which php nos tendr
que aparecer la nueva ruta: /Applications/XAMPP/xamppfiles/bin/php . Para comprobar que
ya funciona el CLI de Laravel accedemos a la ruta donde lo hemos instalado
( /Applications/XAMPP/htdocs/miweb ) y ejecutamos php artisan , lo cual nos tendra que
mostrar:
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message
...
...
Con esto ya tenemos instalado un servidor Web y Laravel funcionando, pero todava nos
falta terminar de configurar nuestra nueva Web con Laravel para que funcione
correctamente.
Instalacin 14
Laravel 5
El nico valor que nos tenemos que asegurar de que est correctamente configurado es la
key o clave de la aplicacin. Esta clave es una cadena de 32 caracteres que se utiliza
Adems tenemos que establecer los permisos de algunas carpetas especiales. En general
no es necesario aadir permisos de escritura para los archivos de nuestra aplicacin, solo
tendremos que hacerlo para las carpetas storage y bootstrap/cache , que es donde
Laravel almacena los logs, sesiones, chachs, etc. Para establecer estos permisos
simplemente tenemos que ejecutar:
Comprobacin de Laravel
Una vez completados todos los pasos anteriores ya podemos comprobar que nuestra nueva
pgina web con Laravel funciona correctamente. Para esto abrimos un navegador y
accedemos a la siguiente URL:
http://localhost/<nombre-de-tu-proyecto-web>/public/
http://localhost/miweb/public/
Esto nos tendra que mostrar una pgina web por defecto como la siguiente:
Instalacin 15
Laravel 5
Instalacin 16
Laravel 5
Funcionamiento bsico
En esta seccin vamos a analizar la estructura de un proyecto, es decir, donde va cada
cosa, y a continuacin veremos el ciclo de vida de una peticin en Laravel.
Estructura de un proyecto
Al crear un nuevo proyecto de Laravel se nos generar una estructura de carpetas y
ficheros para organizar nuestro cdigo. Es importante que conozcamos para que vale cada
elemento y donde tenemos que colocar nuestro cdigo. En este manual lo iremos viendo
poco a poco, por lo que ms adelante se volvern a explicar algunos de estos elementos
ms en detalle. Pero de momento vamos a explicar brevemente las carpetas que ms
utilizaremos y las que mejor tendremos que conocer:
app Contiene el cdigo principal de la aplicacin. Esta carpeta a su vez est dividida
base de datos de nuestro proyecto. Dentro de ella podemos encontrar a su vez tres
carpetas: factores, migrations y seeds. En el captulo sobre base de datos
analizaremos mejor su contenido.
public Es la nica carpeta pblica, la nica que debera ser visible en nuestro
servidor web. Todo las peticiones y solicitudes a la aplicacin pasan por esta carpeta,
ya que en ella se encuentra el index.php , este archivo es el que inicia todo el proceso
de ejecucin del framework. En este directorio tambin se alojan los archivos CSS,
Javascript, imgenes y otros archivos que se quieran hacer pblicos.
resources Esta carpeta contiene a su vez tres carpetas: assets, views y lang:
general sern plantillas de HTML que usan los controladores para mostrar la
informacin. Hay que tener en cuenta que en esta carpeta no se almacenan los
Javascript, CSS o imgenes, ese tipo de archivos se tienen que guardar en la
carpeta public .
Funcionamiento bsico 17
Laravel 5
con los textos de nuestro sitio web en diferentes lenguajes, solo ser necesario
utilizarla en caso que se desee que la aplicacin se pueda traducir.
resources/assets Se utiliza para almacenar los fuentes de los assets tipo less o
sass que se tendran que compilar para generar las hojas de estilo pblicas. No es
necesario usar esta carpeta ya que podemos escribir directamente las las hojas de
estilo dentro de la carpeta public.
bootstrap En esta carpeta se incluye el cdigo que se carga para procesar cada una
para la ejecucin de la web, como son los archivos de sesin, la cach, la compilacin
de las vistas, meta informacin y los logs del sistema. Normalmente tampoco
tendremos que tocar nada dentro de esta carpeta, unicamente se suele acceder a ella
para consultar los logs.
tests Esta carpeta se utiliza para los ficheros con las pruebas automatizadas.
Laravel incluye un sistema que facilita todo el proceso de pruebas con PHPUnit.
vendor En esta carpeta se alojan todas las libreras y dependencias que conforman
Adems en la carpeta raz tambin podemos encontrar dos ficheros muy importantes y que
tambin utilizaremos:
Carpeta App
Funcionamiento bsico 18
Laravel 5
La carpeta app es la que contiene el cdigo principal del proyecto, como son las rutas,
controladores, filtros y modelos de datos. Si accedemos a esta carpeta veremos que
contiene a su vez muchas sub-carpetas, pero la principal que vamos a utilizar es la carpeta
Http :
controladores que sirven para interactuar con los modelos, las vistas y manejar la
lgica de la aplicacin.
app/Http/Middleware Son los filtros o clases intermedias que podemos utilizar para
app/Http/routes.php Este documento define todas las rutas de nuestro sitio web,
enlazando una URL del navegador con un mtodo de un controlador. Adems nos
permite realizar validaciones (mediante Middleware) y otras operaciones sobre las rutas
de nuestro sitio.
Adems de esta carpeta encontraremos muchas otras como Console, Events, Exceptions,
Jobs, Listeners, Policies y Providers. Ms adelante veremos algunas de estas carpetas pero
de momento la nica que vamos a utilizar es Http.
Funcionamiento bsico
El funcionamiento bsico que sigue Laravel tras una peticin web a una URL de nuestro
sitio es el siguiente:
Todas las peticiones entran a travs del fichero public/index.php , el cual en primer
lugar comprobar en el fichero de rutas ( app/Http/routes.php ) si la URL es vlida y en
caso de serlo a que controlador tiene que hacer la peticin.
A continuacin se llamar al mtodo del controlador asignado para dicha ruta. Como
hemos visto, el controlador es el punto de entrada de las peticiones del usuario, el cual,
dependiendo de la peticin:
Acceder a la base de datos (si fuese necesario) a travs de los "modelos" para
obtener datos (o para aadir, modificar o eliminar).
Tras obtener los datos necesarios los preparar para pasrselos a la vista.
Funcionamiento bsico 19
Laravel 5
En el tercer paso el controlador llamar a una vista con una serie de datos asociados,
la cual se preparar para mostrarse correctamente a partir de los datos de entrada y
por ltimo se mostrar al usuario.
En las siguientes secciones iremos viendo cada uno de estos apartados por separado. En
primer lugar se estudiar como podemos definir las rutas que tiene nuestra aplicacin y
como las tenemos que enlazar con los controladores. Seguidamente se vern los
controladores y vistas, dejando los modelos de datos y el uso de la base de datos para ms
adelante.
Funcionamiento bsico 20
Laravel 5
Rutas
Las rutas de nuestra aplicacin aplicacin se tienen que definir en el fichero
routes/web.php . Este es el punto centralizado para la definicin de rutas y cualquier ruta no
definida en este fichero no ser vlida, generado una excepcin (lo que devolver un error
404).
Las rutas, en su forma ms sencilla, pueden devolver directamente un valor desde el propio
fichero de rutas, pero tambin podrn generar la llamada a una vista o a un controlador.
Empezaremos viendo el primer tipo de rutas y en secciones posteriores se tratar como
enlazarlas con una vista o con un controlador.
Rutas bsicas
Las rutas, adems de definir la URL de la peticin, tambin indican el mtodo con el cual se
ha de hacer dicha peticin. Los dos mtodos ms utilizados y que empezaremos viendo son
las peticiones tipo GET y tipo POST. Por ejemplo, para definir una peticin tipo GET
tendramos que aadir el siguiente cdigo a nuestro fichero routes.php :
Route::get('/', function()
{
return 'Hola mundo!';
});
Este cdigo se lanzara cuando se realice una peticin tipo GET a la ruta raz de nuestra
aplicacin. Si estamos trabajando en local esta ruta sera http://localhost pero cuando la
web est en produccin se referira al dominio principal, por ejemplo: http://www.direccin-
de-tu-web.com . Es importante indicar que si se realiza una peticin tipo POST o de otro tipo
que no sea GET a dicha direccin se devolvera un error ya que esa ruta no est definida.
Para definir una ruta tipo POST se realizara de la misma forma pero cambiando el verbo
GET por POST:
Route::post('foo/bar', function()
{
return 'Hola mundo!';
});
Rutas 21
Laravel 5
De la misma forma podemos definir rutas para peticiones tipo PUT o DELETE:
Route::put('foo/bar', function () {
//
});
Route::delete('foo/bar', function () {
//
});
Si queremos que una ruta se defina a la vez para varios verbos lo podemos hacer
aadiendo un array con los tipos, de la siguiente forma:
Route::any('foo', function()
{
return 'Hola mundo!';
});
Route::get('user/{id}', function($id)
{
return 'User '.$id;
});
En este caso estamos definiendo la ruta /user/{id} , donde id es requerido y puede ser
cualquier valor. En caso de no especificar ningn id se producira un error. El parmetro
se le pasar a la funcin, el cual se podr utilizar (como veremos ms adelante) para por
ejemplo obtener datos de la base de datos, almacenar valores, etc.
Rutas 22
Laravel 5
Laravel tambin permite el uso de expresiones regulares para validar los parmetros que se
le pasan a una ruta. Por ejemplo, para validar que un parmetro est formado solo por
letras o solo por nmeros:
Route::get('user/{name}', function($name)
{
//
})
->where('name', '[A-Za-z]+');
Route::get('user/{id}', function($id)
{
//
})
->where('id', '[0-9]+');
$url = url('foo');
Rutas 23
Laravel 5
Con este mtodo nos aseguraremos que la URL sea vlida y adems se le aadir el
dominio que tengamos definido en los ficheros de configuracin. En general no ser
necesaria su utilizacin y simplemente podremos escribir la ruta a mano hasta una direccin
de la forma: /foo (anteponiendo la barra / para asegurarnos que la ruta sea a partir de
la raz del dominio de nuestro sitio). Sin embargo se recomienda la utilizacin de este
mtodo en general para evitar problemas de generacin de rutas no existentes o relativas
(si se nos olvidase anteponer la / ).
Checkpoint
A estas alturas ya tendramos que ser capaces de crear una web con contenido esttico,
simplemente modificando el fichero de rutas y devolviendo todo el contenido desde aqu.
Pero esto no es lo correcto porque terminaramos con un fichero routes.php inmenso con
todo el cdigo mezclado en el mismo archivo. En las siguientes secciones vamos a ver
como separar el cdigo de las vistas y mas adelante aadiremos los controladores.
Rutas 24
Laravel 5
Artisan
Laravel incluye un interfaz de lnea de comandos (CLI, Command line interface) llamado
Artisan. Esta utilidad nos va a permitir realizar mltiples tareas necesarias durante el
proceso de desarrollo o despliegue a produccin de una aplicacin, por lo que nos facilitar
y acelerar el trabajo.
Para ver una lista de todas las opciones que incluye Artisan podemos ejecutar el siguiente
comando en un consola o terminal del sistema en la carpeta raz de nuestro proyecto:
# O simplemente:
php artisan
Si queremos obtener una ayuda ms detallada sobre alguna de las opciones de Artisan
simplemente tenemos que escribir la palabra help delante del comando en cuestin, por
ejemplo:
iremos viendo ms opciones de Artisan, de momento vamos a comentar solo dos opciones
importantes: el listado de rutas y la generacin de cdigo.
Listado de rutas
Para ver un listado con todas las rutas que hemos definido en el fichero routes.php
podemos ejecutar el comando:
Esto nos mostrar una tabla con el mtodo, la direccin, la accin y los filtros definidos para
todas las rutas. De esta forma podemos comprobar todas las rutas de nuestra aplicacin y
asegurarnos de que est todo correcto.
Artisan 25
Laravel 5
Generacin de cdigo
Una de las novedades de Laravel 5 es la generacin de cdigo gracias a Artisan. A travs
de la opcin make podemos generar diferentes componentes de Laravel (controladores,
modelos, filtros, etc.) como si fueran plantillas, esto nos ahorrar mucho trabajo y podremos
empezar a escribir directamente el contenido del componente. Por ejemplo, para crear un
nuevo controlador tendramos que escribir:
Artisan 26
Laravel 5
Vistas
Las vistas son la forma de presentar el resultado (una pantalla de nuestro sitio web) de
forma visual al usuario, el cual podr interactuar con l y volver a realizar una peticin. Las
vistas adems nos permiten separar toda la parte de presentacin de resultados de la lgica
(controladores) y de la base de datos (modelos). Por lo tanto no tendrn que realizar ningn
tipo de consulta ni procesamiento de datos, simplemente recibirn datos y los prepararn
para mostrarlos como HTML.
Definir vistas
Las vistas se almacenan en la carpeta resources/views como ficheros PHP, y por lo tanto
tendrn la extensin .php . Contendrn el cdigo HTML de nuestro sitio web, mezclado con
los assets (CSS, imgenes, Javascripts, etc. que estarn almacenados en la carpeta
public ) y algo de cdigo PHP (o cdigo Blade de plantillas, como veremos ms adelante)
<nombre> es una variable de PHP que la vista tiene que recibir como entrada para poder
mostrarla.
<html>
<head>
<title>Mi Web</title>
</head>
<body>
<h1>Hola <?php echo $nombre; ?>!</h1>
</body>
</html>
Vistas 27
Laravel 5
Route::get('/', function()
{
return view('home', array('nombre' => 'Javi'));
});
En este caso estamos definiendo que la vista se devuelva cuando se haga una peticin tipo
GET a la raz de nuestro sitio. El nico cambio que hemos hecho con respecto a lo que
vimos en la seccin anterior de rutas ha sido en el valor devuelto por la funcin, el cual
genera la vista usando el mtodo view y la devuelve. Esta funcin recibe como
parmetros:
El nombre de la vista (en este caso home ), el cual ser un fichero almacenado en la
carpeta views , acordaros que la vista anterior de ejemplo la habamos guardado en
resources/views/home.php . Para indicar el nombre de la vista se utiliza el mismo
Como hemos visto para referenciar una vista nicamente tenemos que escribir el nombre
del fichero que la contiene pero sin la extensin .php . En el ejemplo, para cargar la vista
almacenada en el fichero home.php la referenciamos mediante el nombre home , sin la
extensin .php ni la ruta resources/views .
Route::get('register', function()
{
return view('user.register');
});
Vistas 28
Laravel 5
(cadena, entero, etc.) u otro array o objeto con ms datos. Por ejemplo, para enviar a la
vista profile todos los datos del usuario cuyo id recibimos a travs de la ruta
tendramos que hacer:
Route::get('user/profile/{id}', function($id)
{
$user = // Cargar los datos del usuario a partir de $id
return view('user.profile', array('user' => $user));
});
Laravel adems ofrece una alternativa que crea una notacin un poco ms clara. En lugar
de pasar un array como segundo parmetro podemos utilizar el mtodo with para indicar
una a una las variables o contenidos que queremos enviar a la vista:
$view = view('user.profile')
->with('user', $user)
->with('editable', false);
Vistas 29
Laravel 5
Los ficheros de vistas que utilizan el sistema de plantillas Blade tienen que tener la
extensin .blade.php . Esta extensin tampoco se tendr que incluir a la hora de
referenciar una vista desde el fichero de rutas o desde un controlador. Es decir, utilizaremos
view('home') tanto si el fichero se llama home.php como home.blade.php .
En general el cdigo que incluye Blade en una vista empezar por los smbolos @ o {{ ,
el cual posteriormente ser procesado y preparado para mostrarse por pantalla. Blade no
aade sobrecarga de procesamiento, ya que todas las vistas son preprocesadas y
cacheadas, por el contrario nos brinda utilidades que nos ayudarn en el diseo y
modularizacin de las vistas.
Mostrar datos
El mtodo ms bsico que tenemos en Blade es el de mostrar datos, para esto utilizaremos
las llaves dobles ({{ }}) y dentro de ellas escribiremos la variable o funcin con el contenido
a mostrar:
Como hemos visto podemos mostrar el contenido de una variable o incluso llamar a una
funcin para mostrar su resultado. Blade se encarga de escapar el resultado llamando a
htmlentities para prevenir errores y ataques de tipo XSS. Si en algn caso no queremos
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 aplicacin. Esto evitar
que inyecten smbolos que produzcan errores o inyecten codigo javascript que se
ejecute sin que nosotros queramos. Por lo tanto, este ltimo mtodo solo tenemos que
utilizarlo si estamos seguros de que no queremos que se escape el contenido.
Comentarios
Para escribir comentarios en Blade se utilizan los smbolos {{-- y --}} , por ejemplo:
Estructuras de control
Blade nos permite utilizar la estructura if de las siguientes formas:
En los siguientes ejemplos se puede ver como realizar bucles tipo for, while o foreach:
@while (true)
<p>Soy un bucle while infinito!</p>
@endwhile
Esta son las estructuras de control ms utilizadas. Ademas de estas Blade define algunas
ms que podemos ver directamente en su documentacin: http://laravel.com/docs/5.1/blade
@include('view_name')
@include('view_name', array('some'=>'data'))
Esta opcin es muy til para crear vistas que sean reutilizables o para separar el contenido
de una vista en varios ficheros.
Layouts
Blade tambin nos permite la definicin de layouts para crear una estructura HTML base
con secciones que sern rellenadas por otras plantillas o vistas hijas. Por ejemplo, podemos
crear un layout con el contenido principal o comn de nuestra web (head, body, etc.) y
definir una serie de secciones que sern rellenados por otras plantillas para completar el
cdigo. Este layout puede ser utilizado para todas las pantallas de nuestro sitio web, lo que
nos permite que en el resto de plantillas no tengamos que repetir todo este cdigo.
<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 habamos definido en el mismo:
@extends('layouts.master')
@section('menu')
@parent
<p>Este condenido es aadido al men principal.</p>
@endsection
@section('content')
<p>Este apartado aparecer en la seccin "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 aadiendo contenido en las
plantillas hijas, mientras que @yield ser sustituido por el contenido que se indique. El
mtodo @parent carga en la posicin indicada el contenido definido por el padre para dicha
seccin.
Ejercicios
En los ejercicios de esta seccin del curso vamos a desarrollar una pequea web para la
gestin interna de un videoclub, empezaremos por definir las rutas y vistas del sitio y poco a
poco en los siguientes ejercicios la iremos completando hasta terminar el sitio web
completo.
El objetivo es realizar un sitio web para la gestin interna en un videoclub, el cual estar
protegido mediante usuario y contrasea. Una vez autorizado el acceso, el usuario podr
listar el catlogo de pelculas, ver informacin detallada de una pelcula, realizar bsquedas
o filtrados y algunas operaciones ms de gestin.
Ejercicios 34
Laravel 5
/ Pantalla principal
auth/login Login usuario
auth/logout Logout usuario
Para comprobar que las rutas se hayan creado correctamente utiliza el comando de
artisan que devuelve un listado de rutas y adems prueba tambin las rutas en el
navegador.
Tambin nos tenemos que descargar desde los materiales de los ejercicios la plantilla para
la barra de navegacin principal ( navbar.blade.php ) y la almacenamos en la carpeta
resources/views/partials .
Cambiamos las rutas para la carga de los assets (css y js) que hemos almacenado
en local. Para generar la ruta completa y que encuentre los recursos tendremos
que escribir los siguientes comandos:
Ejercicios 35
Laravel 5
{{ url('/assets/bootstrap/css/bootstrap.min.css') }}
{{ url('/assets/bootstrap/js/bootstrap.min.js') }}
Dentro de la seccin <body> del HTML, eliminamos el texto que viene de ejemplo
( <h1>Hello, world!</h1> ) e incluimos la barra de navegacin que hemos guardado
antes utilizando el siguiente cdigo:
@include('partials.navbar')
<div class="container">
@yield('content')
</div>
Con esto ya hemos definido el layout principal, sin embargo todava no podemos probarlo
ya que no est asociado a ninguna ruta. En el siguiente ejercicio realizaremos los cambios
necesarios para poder verlo y adems aadiremos el resto de vistas hijas.
@extends('layouts.master')
@section('content')
Pantalla principal
@stop
Para organizar mejor las vistas las vamos a agrupar en sub-carpetas dentro de la carpeta
resources/views siguiendo la siguiente estructura:
Ejercicios 36
Laravel 5
Creamos una vista separada para todas las rutas excepto para la ruta "logout", la cual
no tendr ninguna vista.
Por ltimo vamos a actualizar las rutas del fichero routes/web.php para que se carguen las
vistas que acabamos de crear. Acordaros que para referenciar las vistas que estn dentro
de carpetas la barra / de separacin se transforma en un punto, y que adems, como
segundo parmetro, podemos pasar datos a la vista. A continuacin se incluyen algunos
ejemplos:
return view('home');
return view('catalog.index');
return view('catalog.show', array('id'=>$id));
Una vez hechos estos cambios ya podemos probarlo en el navegador, el cual debera
mostrar en todos los casos la plantilla base con la barra de navegacin principal y los estilos
de Bootstrap aplicados. En la seccin principal de contenido de momento solo podremos
ver los textos que hemos puesto de ejemplo.
Ejercicios 37
Laravel 5
Captulo 2.
Controladores, filtros y formularios
En este captulo empezaremos a utilizar realmente el patrn MVC y veremos como aadir
controladores a nuestros proyectos web. Adems tambin veremos el concepto de filtros
mediante Middleware aplicados sobre el fichero de rutas y como realizar redirecciones en
Laravel. Por ltimo se incluye una seccin de ejercicios para practicar con todo lo
aprendido.
Controladores
Hasta el momento hemos visto solamente como devolver una cadena para una ruta y como
asociar una vista a una ruta directamente en el fichero de rutas. Pero en general la forma
recomendable de trabajar ser asociar dichas rutas a un mtodo de un controlador. Esto
nos permitir separar mucho mejor el cdigo y crear clases (controladores) que agrupen
toda la funcionalidad de un determinado recurso. Por ejemplo, podemos crear un
controlador para gestionar toda la lgica asociada al control de usuarios o cualquier otro tipo
de recurso.
Controlador bsico
Los controladores se almacenan en ficheros PHP en la carpeta app/Http/Controllers y
normalmente se les aade el sufijo Controller , por ejemplo UserController.php o
MoviesController.php . A continuacin se incluye un ejemplo bsico de un controlador
<?php
namespace App\Http\Controllers;
use App\User;
use App\Http\Controllers\Controller;
Controladores 39
Laravel 5
Todos los controladores tienen que extender la clase base Controller . Esta clase viene ya
creada por defecto con la instalacin de Laravel, la podemos encontrar en la carpeta
app/Http/Controllers . Se utiliza para centralizar toda la lgica que se vaya a utilizar de
forma compartida por los controladores de nuestra aplicacin. Por defecto solo carga cdigo
para validacin y autorizacin, pero podemos aadir en la misma todos los mtodos que
necesitemos.
Una vez definido un controlador ya podemos asociarlo a una ruta. Para esto tenemos que
modificar el fichero de rutas routes.php de la forma:
Route::get('user/{id}', 'UserController@showProfile');
En lugar de pasar una funcin como segundo parmetro, tenemos que escribir una cadena
que contenga el nombre del controlador, seguido de una arroba @ y del nombre del
mtodo que queremos asociar. No es necesario aadir nada ms, ni los parmetros que
recibe el mtodo en cuestin, todo esto se hace de forma automtica.
mano y rellenar nosotros todo el cdigo, o podemos utilizar el siguiente comando de Artisan
que nos adelantar todo el trabajo:
aadir la opcin --plain le indicamos que no aada ningn mtodo al controlador, por lo
que el cuerpo de la clase estar vaco. De momento vamos a utilizar esta opcin para
aadir nosotros mismos los mtodos que necesitemos. Ms adelante, cuando hablemos
sobre controladores tipo RESTful, volveremos a ver esta opcin.
Controladores 40
Laravel 5
Route::get('foo', 'Photos\AdminController@method');
$url = action('FooController@method');
Por ejemplo, para crear en una plantilla con Blade un enlace que apunte a una accin
haramos:
Controladores implcitos
Laravel tambin permite definir fcilmente la creacin de controladores como recursos que
capturen todas las rutas de un determinado dominio. Por ejemplo, capturar todas las
consultas que se realicen a la URL "users" o "users" seguido de cualquier cosa (por ejemplo
"users/profile"). Para esto en primer lugar tenemos que definir la ruta en el fichero de rutas
usando Route::controller de la forma:
Controladores 41
Laravel 5
Route::controller('users', 'UserController');
Esto quiere decir que todas las peticiones realizadas a la ruta "users" o subrutas de "users"
se redirigirn al controlador UserController . Adems se capturarn las peticiones de
cualquier tipo, ya sean GET o POST, a dichas rutas. Para gestionar estas rutas en el
controlador tenemos que seguir un patrn a la hora de definir el nombre de los mtodos:
primero tendremos que poner el tipo de peticin y despus la sub-ruta a la que debe de
responder. Por ejemplo, para gestionar las peticiones tipo GET a la URL "users/profile"
tendremos que crear el mtodo "getProfile". La nica excepcin a este caso es "Index" que
se referir a las peticiones a la ruta raz, por ejemplo "getIndex" gestionar las peticiones
GET a "users". A continuacin se incluye un ejemplo:
Adems, si queremos crear rutas con varias palabras lo podemos hacer usando la notacin
"CamelCase" en el nombre del mtodo. Por ejemplo el mtodo "getAdminProfile" ser
parseado a la ruta "users/admin-profile".
Tambin podemos definir un mtodo especial que capture las todas las peticiones
"perdidas" o no capturadas por el resto de mtodos. Para esto simplemente tenemos que
definir un mtodo con el nombre missingMethod que recibir por parmetros la ruta y los
parmetros de la peticin:
Controladores 42
Laravel 5
Cach de rutas
Si definimos todas nuestras rutas para que utilicen controladores podemos aprovechar la
nueva funcionalidad para crear una cach de las rutas. Es importante que estn basadas en
controladores porque si definimos respuestas directas desde el fichero de rutas (como
vimos en el captulo anterior) la cach no funcionar.
Gracias a la cach Laravel indican que se puede acelerar el proceso de registro de rutas
hasta 100 veces. Para generar la cach simplemente tenemos que ejecutar el comando de
Artisan:
Controladores 43
Laravel 5
Middleware o filtros
Los componentes llamados Middleware son un mecanismo proporcionado por Laravel para
filtrar las peticiones HTTP que se realizan a una aplicacin. Un filtro o middleware se
define como una clase PHP almacenada en un fichero dentro de la carpeta
app/Http/Middleware . Cada middleware se encargar de aplicar un tipo concreto de filtro y
de decidir que realizar con la peticin realizada: permitir su ejecucin, dar un error o
redireccionar a otra pgina en caso de no permitirla.
Laravel incluye varios filtros por defecto, uno de ellos es el encargado de realizar la
autenticacin de los usuarios. Este filtro lo podemos aplicar sobre una ruta, un conjunto de
rutas o sobre un controlador en concreto. Este middleware se encargar de filtrar las
peticiones a dichas rutas: en caso de estar logueado y tener permisos de acceso le
permitir continuar con la peticin, y en caso de no estar autenticado lo redireccionar al
formulario de login.
Middleware o filtros 44
Laravel 5
<?php
namespace App\Http\Middleware;
use Closure;
class MyMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
}
El cdigo generado por Artisan ya viene preparado para que podamos escribir directamente
la implementacin del filtro a realizar dentro de la funcin handle . Como podemos ver, esta
funcin solo incluye el valor de retorno con una llamada a return $next($request); , que lo
que hace es continuar con la peticin y ejecutar el mtodo que tiene que procesarla. Como
entrada la funcin handle recibe dos parmetros:
Por ejemplo podramos crear un filtro que redirija al home si el usuario tiene menos de 18
aos y en otro caso que le permita acceder a la ruta:
return $next($request);
}
Como hemos dicho antes, podemos hacer tres cosas con una peticin:
Realizar una redireccin a otra ruta para no permitir el acceso con: return
Middleware o filtros 45
Laravel 5
redirect('home');
Lanzar una excepcin o llamar al mtodo abort para mostrar una pgina de error:
abort(403, 'Unauthorized action.');
peticin:
return $next($request);
}
return $response;
}
Uso de Middleware
De momento hemos visto para que vale y como se define un Middleware, en esta seccin
veremos como utilizarlos. Laravel permite la utilizacin de Middleware de tres formas
distintas: global, asociado a rutas o grupos de rutas, o asociado a un controlador o a un
mtodo de un controlador. En los tres casos ser necesario registrar primero el Middleware
en la clase app/Http/Kernel.php .
Middleware global
Middleware o filtros 46
Laravel 5
Para hacer que un Middleware se ejecute con todas las peticiones HTTP realizadas a una
aplicacin simplemente lo tenemos que registrar en el array $middleware definido en la
clase app/Http/Kernel.php . Por ejemplo:
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\App\Http\Middleware\MyMiddleware::class,
];
En este ejemplo hemos registrado la clase MyMiddleware al final del array. Si queremos que
nuestro middleware se ejecute antes que otro filtro simplemente tendremos que colocarlo
antes en la posicin del array.
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'es_mayor_de_edad' => \App\Http\Middleware\MyMiddleware::class,
];
Middleware o filtros 47
Laravel 5
Para asociar un filtro con una ruta que utiliza un mtodo de un controlador se realizara de
la misma manera pero indicando la accin mediante la clave " uses ":
Route::get('profile', [
'middleware' => 'auth',
'uses' => 'UserController@showProfile'
]);
Si queremos asociar varios middleware con una ruta simplemente tenemos que aadir un
array con las claves. Los filtros se ejecutarn en el orden indicado en dicho array:
Laravel tambin permite asociar los filtros con las rutas usando el mtodo middleware()
sobre la definicin de la ruta de la forma:
Route::get('/', function () {
// ...
})->middleware(['first', 'second']);
// O sobre un controlador:
Route::get('profile', 'UserController@showProfile')->middleware('auth');
Middleware o filtros 48
Laravel 5
Este mtodo muestra una tabla con todas las rutas, mtodos y acciones. Ademas para cada
ruta indica los filtros asociados, tanto si estn definidos desde el fichero de rutas como
desde dentro de un controlador. Por lo tanto es muy til para comprobar que todas las
rutas y filtros que hemos definido se hayan creado correctamente.
Paso de parmetros
Un Middleware tambin puede recibir parmetros. Por ejemplo, podemos crear un filtro para
comprobar si el usuario logueado tiene un determinado rol indicado por parmetro. Para
esto lo primero que tenemos que hacer es aadir un tercer parmetro a la funcin handle
del Middleware:
Middleware o filtros 49
Laravel 5
<?php
namespace App\Http\Middleware;
use Closure;
class RoleMiddleware
{
/**
* Run the request filter.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string $role
* @return mixed
*/
public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
// No tiene el rol esperado!
}
return $next($request);
}
Si tenemos que pasar ms de un parmetro al filtro los separaremos por comas, por
ejemplo: role:editor,admin .
Middleware o filtros 50
Laravel 5
Rutas avanzadas
Laravel permite crear grupos de rutas para especificar opciones comunes a todas ellas,
como por ejemplo un middleware, un prefijo, un subdominio o un espacio de nombres que
se tiene que aplicar sobre todas ellas.
A continuacin vamos a ver algunas de estas opciones, en todos los casos usaremos el
mtodo Route::group , el cual recibir como primer parmetro las opciones a aplicar sobre
todo el grupo y como segundo parmetro una clausula con la definicin de las rutas.
Route::get('user/profile', function () {
// Ruta filtrada por el middleware
});
});
Rutas avanzadas 51
Laravel 5
Tambin podemos crear grupos de rutas dentro de otros grupos. Por ejemplo para definir un
grupo de rutas a utilizar en una API y crear diferentes rutas segn la versin de la API
podramos hacer:
De esta forma podemos crear secciones dentro de nuestro fichero de rutas para agrupar,
por ejemplo, todas las rutas pblicas, todas las de la seccin privada de administracin,
seccin privada de usuario, las rutas de las diferentes versiones de la API de nuestro sitio,
etc.
Esta opcin tambin la podemos aprovechar para especificar parmetros comunes que se
recogern para todas las rutas y se pasarn a todos los controladores o funciones
asociadas, por ejemplo:
Rutas avanzadas 52
Laravel 5
Redirecciones
Como respuesta a una peticin tambin podemos devolver una redireccin. Esta opcin
ser interesante cuando, por ejemplo, el usuario no est logueado y lo queramos redirigir al
formulario de login, o cuando se produzca un error en la validacin de una peticin y
queramos redirigir a otra ruta.
Para esto simplemente tenemos que utilizar el mtodo redirect indicando como
parmetro la ruta a redireccionar, por ejemplo:
return redirect('user/login');
return back();
return redirect()->action('HomeController@index');
Si queremos aadir parmetros para la llamada al mtodo del controlador tenemos que
aadirlos pasando un array como segundo parmetro:
Redirecciones 53
Laravel 5
return redirect('form')->withInput();
Este mtodo tambin lo podemos usar con la funcin back o con la funcin action :
return back()->withInput();
return redirect()->action('HomeController@index')->withInput();
Redirecciones 54
Laravel 5
Formularios
La ltima versin de Laravel no incluye ninguna utilidad para la generacin de formularios.
En esta seccin vamos a repasar brevemente como crear un formulario usando etiquetas
de HTML, los distintos elementos o inputs que podemos utilizar, adems tambin veremos
como conectar el envo de un formulario con un controlador, como protegernos de ataques
CSRF y algunas cuestiones ms.
Crear formularios
Para abrir y cerrar un formulario que apunte a la URL actual y utilice el mtodo POST
tenemos que usar las siguientes etiquetas HTML:
<form method="POST">
...
</form>
La funcin url generar la direccin a la ruta indicada. Ademas tambin podemos usar la
funcin action para indicar directamente el mtodo de un controlador a utilizar, por
ejemplo: action('HomeController@getIndex')
Como hemos visto anteriormente, en Laravel podemos definir distintas acciones para
procesar peticiones realizadas a una misma ruta pero usando un mtodo distinto (GET,
POST, PUT, DELETE). Por ejemplo, podemos definir la ruta " user " de tipo GET para que
nos devuelva la pgina con el formulario para crear un usuario, y por otro lado definir la ruta
" user " de tipo POST para procesar el envo del formulario. De esta forma cada ruta
apuntar a un mtodo distinto de un controlador y nos facilitar la separacin del cdigo.
HTML solo permite el uso de formularios de tipo GET o POST. Si queremos enviar un
formulario usando otros de los mtodos (o verbos) definidos en el protocolo REST, como
son PUT, PATCH o DELETE, tendremos que aadir un campo oculto para indicarlo. Laravel
establece el uso del nombre " _method " para indicar el mtodo a usar, por ejemplo:
Formularios 55
Laravel 5
Laravel se encargar de recoger el valor de dicho campo y de procesarlo como una peticin
tipo PUT (o la que indiquemos). Adems, para facilitar ms la definicin de este tipo de
formularios ha aadido la funcin method_field que directamente crear este campo
oculto:
Laravel proporciona una forma fcil de protegernos de este tipo de ataques. Simplemente
tendremos que llamar al mtodo csrf_field despus de abrir el formulario, igual que
vimos en la seccin anterior, este mtodo aadir un campo oculto ya configurado con los
valores necesarios. A continuacin se incluye un ejemplo de uso:
Elementos de un formulario
A continuacin vamos a ver los diferentes elementos que podemos aadir a un formulario.
En todos los tipos de campos en los que tengamos que recoger datos es importante aadir
sus atributos name e id , ya que nos servirn despus para recoger los valores rellenados
por el usuario.
Campos de texto
Formularios 56
Laravel 5
Para crear un campo de texto usamos la etiqueta de HTML input , para la cual tenemos
que indicar el tipo text y su nombre e identificador de la forma:
En este ejemplo hemos creado un campo de texto vaco cuyo nombre e identificador es
"nombre". El atributo name indica el nombre de variable donde se guardar el texto
introducido por el usuario y que despus utilizaremos desde el controlador para acceder al
valor.
Desde una vista con Blade podemos asignar el contenido de una variable (en el ejemplo
$nombre ) para que aparezca el campo de texto con dicho valor. Esta opcin es muy til
para crear formularios en los que tenemos que editar un contenido ya existente, como por
ejemplo editar los datos de usuario. A continuacin se muestra un ejemplo:
Para mostrar los valores introducidos en una peticin anterior podemos usar el mtodo
old , el cual recuperar las variables almacenadas en la peticin anterior. Por ejemplo,
Ms adelante, cuando veamos como recoger los datos de entrada revisaremos el proceso
completo para procesar un formulario.
Formularios 57
Laravel 5
Los campos para contraseas lo nico que hacen es ocultar las letras escritas. Los campos
ocultos se suelen utilizar para almacenar opciones o valores que se desean enviar junto con
los datos del formulario pero que no se tienen que mostrar al usuario. En las secciones
anteriores ya hemos visto que Laravel lo utiliza internamente para almacenar un hash o
cdigo para la proteccin contra ataques tipo CSRF y que tambin lo utiliza para indicar si el
tipo de envo del formulario es distinto de POST o GET. Adems nosotros lo podemos
utilizar para almacenar cualquier valor que despus queramos recoger justo con los datos
del formulario.
Tambin podemos crear otro tipo de inputs como email, number, tel, etc. (podis consultar
la lista de tipos permitidos aqu:
http://www.w3schools.com/html/html_form_input_types.asp). Para definir estos campos se
hace exactamente igual que para un campo de texto pero cambiando el tipo por el deseado,
por ejemplo:
Textarea
Para crear un rea de texto simplemente tenemos que usar la etiqueta HTML textarea de
la forma:
Esta etiqueta adems permite indicar el nmero de filas ( rows ) y columnas ( cols ) del
rea de texto. Para insertar un texto o valor inicial lo tenemos que poner entre la etiqueta de
apertura y la de cierre. A continuacin se puede ver un ejemplo completo:
Etiquetas
Formularios 58
Laravel 5
Las etiquetas nos permiten poner un texto asociado a un campo de un formulario para
indicar el tipo de contenido que se espera en dicho campo. Por ejemplo aadir el texto
"Nombre" antes de un input tipo texto donde el usuario tendr que escribir su nombre.
Para crear una etiqueta tenemos que usar el tag " label " de HTML:
<label for="nombre">Nombre</label>
Donde el atributo for se utiliza para especificar el identificador del campo relacionado con
la etiqueta. De esta forma, al pulsar sobre la etiqueta se marcar automticamente el
campo relacionado. A continuacin se muestra un ejemplo completo:
En este caso, al enviar el formulario, si el usuario marca la casilla nos llegara la variable
con nombre terms con valor 1 . En caso de que no marque la casilla no llegara nada, ni
siquiera la variable vaca.
Para crear una lista de checkbox o de radio button es importante que todos tengan el
mismo nombre (para la propiedad name ). De esta forma los valores devueltos estarn
agrupados en esa variable, y adems, el radio button funcionar correctamente: al apretar
sobre una opcin se desmarcar la que este seleccionada en dicho grupo (entre todos los
que tengan el mismo nombre). Por ejemplo:
Adems podemos aadir el atributo checked para marcar una opcin por defecto:
Formularios 59
Laravel 5
<label for="clase">Clase:</label>
<input type="radio" name="clase" id="clase" value="turista" checked>Turista<br>
<input type="radio" name="clase" id="clase" value="preferente">Preferente<br>
Ficheros
Para generar un campo para subir ficheros utilizamos tambin la etiqueta input indicando en
su tipo el valor file , por ejemplo:
Para enviar ficheros la etiqueta de apertura del formulario tiene que cumplir dos requisitos
importantes:
Listas desplegables
Para crear una lista desplegable utilizamos la etiqueta HTML select . Las opciones la
indicaremos entre la etiqueta de apertura y cierre usando elementos option , de la forma:
<select name="marca">
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
<option value="mercedes">Mercedes</option>
<option value="audi">Audi</option>
</select>
En el ejemplo anterior se crear una lista desplegable con cuatro opciones. Al enviar el
formulario el valor seleccionado nos llegar en la variable marca . Adems, para elegir una
opcin por defecto podemos utilizar el atributo selected , por ejemplo:
Formularios 60
Laravel 5
Botones
Por ltimo vamos a ver como aadir botones a un formulario. En un formulario podremos
aadir tres tipos distintos de botones:
button para crear botones normales para realizar otro tipo de acciones (como volver a
la pgina anterior).
<button type="submit">Enviar</button>
<button type="reset">Borrar</button>
<button type="button">Volver</button>
Formularios 61
Laravel 5
Ejercicios
En los ejercicios de esta parte vamos a continuar con el sitio Web que empezamos para la
gestin de un videoclub. Primero aadiremos los controladores y mtodos asociados a cada
ruta, y posteriormente tambin completaremos las vistas usando formularios y el sistema de
plantillas Blade.
Empezamos por aadir los dos controladores que nos van a hacer falta:
CatalogController.php y HomeController.php . Para esto tenis que utilizar el comando de
Acordaros que los mtodos getShow y getEdit tendrn que recibir como parmetro el
$id del elemento a mostrar o editar, por lo que la definicin del mtodo en el controlador
Ejercicios 62
Laravel 5
Por ltimo vamos a cambiar el fichero de rutas routes.php para que todas las rutas que
tenamos definidas (excepto las de login y logout que las dejaremos como estn) apunten a
los nuevos mtodos de los controladores, por ejemplo:
Route::get('/', 'HomeController@getHome');
El cdigo que tenamos puesto para cada ruta con el return con la generacin de la vista
lo tenis que mover al mtodo del controlador correspondiente.
Mtodo HomeController@getHome
En este mtodo de momento solo vamos a hacer una redireccin a la accin que muestra el
listado de pelculas del catlogo: return redirect()-
>action('CatalogController@getIndex'); . Ms adelante tendremos que comprobar si el
usuario est logueado o no, y en caso de que no lo este redirigirle al formulario de login.
Mtodo CatalogController@getIndex
Este mtodo tiene que mostrar un listado de todas las pelculas que tiene el videoclub. El
listado de pelculas lo podis obtener del fichero array_peliculas.php facilitado con los
materiales. Este array de pelculas lo tenis que copiar como variable miembro de la clase
(ms adelante las almacenaremos en la base de datos). En el mtodo del controlador
simplemente tendremos que modificar la generacin de la vista para pasarle este array de
pelculas completo ( $this->arrayPeliculas ).
Ejercicios 63
Laravel 5
<div class="row">
</div>
@endforeach
</div>
Como se puede ver en el cdigo, en primer lugar se crea una fila (usando el sistema de
rejilla de Bootstrap) y a continuacin se realiza un bucle foreach utilizando la notacin de
Blade para iterar por todas las pelculas. Para cada pelcula obtenemos su posicin en el
array y sus datos asociados, y generamos una columna para mostrarlos. Es importante que
nos fijemos en como se itera por los elementos de un array de datos y en la forma de
acceder a los valores. Adems se ha incluido un enlace para que al pulsar sobre una
pelcula nos lleve a la direccin /catalog/show/{$key} , siendo key la posicin de esa
pelcula en el array.
Mtodo CatalogController@getShow
Este mtodo se utiliza para mostrar la vista detalle de una pelcula. Hemos de tener en
cuenta que el mtodo correspondiente recibe un identificador que (de momento) se refiere a
la posicin de la pelcula en el array. Por lo tanto, tendremos que coger dicha pelcula del
array ( $this->arrayPeliculas[$id] ) y pasrsela a la vista.
En esta vista vamos a crear dos columnas, la primera columna para mostrar la imagen de la
pelcula y la segunda para incluir todos los detalles. A continuacin se incluye la estructura
HTML que tendra que tener esta pantalla:
Ejercicios 64
Laravel 5
<div class="row">
<div class="col-sm-4">
</div>
<div class="col-sm-8">
</div>
</div>
Adems tenemos que incluir dos botones ms, un botn que nos llevar a editar la pelcula
y otro para volver al listado de pelculas.
Esta pantalla finalmente tendra que tener una apariencia similar a la siguiente:
Ejercicios 65
Laravel 5
Mtodo CatalogController@getCreate
Este mtodo devuelve la vista " catalog.create " para aadir una nueva pelcula. Para crear
este formulario en la vista correspondiente nos podemos basar en el contenido de la
plantilla " catalog_create.php ". Esta plantilla tiene una serie de TODOs que hay que
completar. En total tendr que tener los siguientes campos:
Mtodo CatalogController@getEdit
Ejercicios 66
Laravel 5
De momento no tendremos que hacer nada ms, ms adelante lo completaremos para que
se rellene con los datos de la pelcula a editar.
Ejercicios 67
Laravel 5
Captulo 3.
Base de datos
Laravel facilita la configuracin y el uso de diferentes tipos de base de datos: MySQL,
Postgres, SQLite y SQL Server. En el fichero de configuracin ( config/database.php )
tenemos que indicar todos los parmetros de acceso a nuestras bases de datos y adems
especificar cual es la conexin que se utilizar por defecto. En Laravel podemos hacer uso
de varias bases de datos a la vez, aunque sean de distinto tipo. Por defecto se acceder a
la que especifiquemos en la configuracin y si queremos acceder a otra conexin lo
tendremos que indicar expresamente al realizar la consulta.
En este captulo veremos como configurar una base de datos, como crear tablas y
especificar sus campos desde cdigo, como inicializar la base de datos y como construir
consultas tanto de forma directa como a travs del ORM llamado Eloquent.
Configuracin inicial
En este primer apartado vamos a ver los primeros pasos que tenemos que dar con Laravel
para empezar a trabajar con bases de datos. Para esto vamos a ver a continuacin como
definir la configuracin de acceso, como crear una base de datos y como crear la tabla de
migraciones, necesaria para crear el resto de tablas.
Este valor indica el tipo de base de datos a utilizar por defecto. Como vimos en el primer
captulo Laravel utiliza el sistema de variables de entorno para separar las distintas
configuraciones de usuario o de mquina. El mtodo env('DB_CONNECTION', 'mysql') lo que
hace es obtener el valor de la variable DB_CONNECTION del fichero .env . En caso de que
dicha variable no est definida devolver el valor por defecto mysql .
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'), // Nombre de la base de datos
'username' => env('DB_USERNAME', 'forge'), // Usuario de acceso a la bd
'password' => env('DB_PASSWORD', ''), // Contrasea de acceso
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
Configuracin inicial 69
Laravel 5
Como se puede ver, bsicamente los campos que tenemos que configurar para usar
nuestra base de datos son: host, database, username y password. El host lo podemos dejar
como est si vamos a usar una base de datos local, mientras que los otros tres campos s
que tenemos que actualizarlos con el nombres de la base de datos a utilizar y el usuario y la
contrasea de acceso. Para poner estos valores abrimos el fichero .env de la raz del
proyecto y los actualizamos:
DB_CONNECTION=mysql
DB_HOST=localhost
DB_DATABASE=nombre-base-de-datos
DB_USERNAME=nombre-de-usuario
DB_PASSWORD=contrasea-de-acceso
http://localhost/phpmyadmin
La cual nos mostrar un panel para la gestin de las bases de datos de MySQL, que nos
permite, adems de realizar cualquier tipo de consulta SQL, crear nuevas bases de datos o
tablas, e insertar, modificar o eliminar los datos directamente. En nuestro caso apretamos
en la pestaa "Bases de datos" y creamos una nueva base de datos. El nombre que le
pongamos tiene que ser el mismo que el que hayamos indicado en el fichero de
configuracin de Laravel.
Tabla de migraciones
A continuacin vamos a crear la tabla de migraciones. En la siguiente seccin veremos en
detalle que es esto, de momento solo decir que Laravel utiliza las migraciones para poder
definir y crear las tablas de la base de datos desde cdigo, y de esta manera tener un
control de las versiones de las mismas.
Para poder empezar a trabajar con las migraciones es necesario en primer lugar crear la
tabla de migraciones. Para esto tenemos que ejecutar el siguiente comando de Artisan:
Configuracin inicial 70
Laravel 5
Si nos diese algn error tendremos que revisar la configuracin que hemos puesto de
la base de datos y si hemos creado la base de datos con el nombre, usuario y
contrasea indicado.
las siguientes secciones veremos como aadir tablas y posteriormente como realizar
consultas.
Configuracin inicial 71
Laravel 5
Migraciones
Las migraciones son un sistema de control de versiones para bases de datos. Permiten que
un equipo trabaje sobre una base de datos aadiendo y modificando campos, manteniendo
un histrico de los cambios realizados y del estado actual de la base de datos. Las
migraciones se utilizan de forma conjunta con la herramienta Schema builder (que veremos
en la siguiente seccin) para gestionar el esquema de base de datos de la aplicacin.
Si lo que queremos es aadir una migracin que modifique los campos de una tabla
existente tendremos que ejecutar el siguiente comando:
dicha tabla.
Por defecto, al indicar el nombre del fichero de migraciones se suele seguir siempre el
mismo patrn (aunque el realidad el nombre es libre). Si es una migracin que crea una
tabla el nombre tendr que ser create_<table-name>_table y si es una migracin que
modifica una tabla ser <action>_to_<table-name>_table .
Migraciones 72
Laravel 5
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
/**
* Reverse the migrations.
* @return void
*/
public function down()
{
//
}
}
Ejecutar migraciones
Despus de crear una migracin y de definir los campos de la tabla (en la siguiente seccin
veremos como especificar esto) tenemos que lanzar la migracin con el siguiente comando:
Si nos aparece el error "class not found" lo podremos solucionar llamando a composer
dump-autoload y volviendo a lanzar las migraciones.
Migraciones 73
Laravel 5
Adems si queremos comprobar el estado de las migraciones, para ver las que ya estn
instaladas y las que quedan pendientes, podemos ejecutar:
Migraciones 74
Laravel 5
Schema Builder
Una vez creada una migracin tenemos que completar sus mtodos up y down para
indicar la tabla que queremos crear o el campo que queremos modificar. En el mtodo
down siempre tendremos que aadir la operacin inversa, eliminar la tabla que se ha
Para especificar la tabla a crear o modificar, as como las columnas y tipos de datos de las
mismas, se utiliza la clase Schema. Esta clase tiene una serie de mtodos que nos
permitir especificar la estructura de las tablas independientemente del sistema de base de
datos que utilicemos.
Donde el primer argumento es el nombre de la tabla y el segundo es una funcin que recibe
como parmetro un objeto del tipo Blueprint que utilizaremos para configurar las columnas
de la tabla.
En la seccin down de la migracin tendremos que eliminar la tabla que hemos creado,
para esto usaremos alguno de los siguientes mtodos:
Schema::drop('users');
Schema::dropIfExists('users');
Al crear una migracin con el comando de Artisan make:migration ya nos viene este cdigo
aadido por defecto, la creacin y eliminacin de la tabla que se ha indicado y adems se
aaden un par de columnas por defecto (id y timestamps).
Aadir columnas
Schema Builder 75
Laravel 5
El constructor Schema::create recibe como segundo parmetro una funcin que nos
permite especificar las columnas que va a tener dicha tabla. En esta funcin podemos ir
aadiendo todos los campos que queramos, indicando para cada uno de ellos su tipo y
nombre, y adems si queremos tambin podremos indicar una serie de modificadores como
valor por defecto, ndices, etc. Por ejemplo:
Schema::create('users', function($table)
{
$table->increments('id');
$table->string('username', 32);
$table->string('password');
$table->smallInteger('votos');
$table->string('direccion');
$table->boolean('confirmado')->default(false);
$table->timestamps();
});
Schema define muchos tipos de datos que podemos utilizar para definir las columnas de
una tabla, algunos de los principales son:
Schema Builder 76
Laravel 5
$table->boolean('confirmed'); BOOLEAN
$table->enum('choices', array('foo',
ENUM
'bar'));
$table->float('amount'); FLOAT
$table->smallInteger('votes'); SMALLINT
$table->tinyInteger('numbers'); TINYINT
$table->string('email'); VARCHAR
$table->string('name', 100); VARCHAR con la longitud indicada
$table->text('description'); TEXT
$table->timestamp('added_on'); TIMESTAMP
Aade los timestamps "created_at" y
$table->timestamps();
"updated_at"
->nullable() Indicar que la columna permite valores NULL
Los tres ltimos se pueden combinar con el resto de tipos para crear, por ejemplo, una
columna que permita nulos, con un valor por defecto y de tipo unsigned.
Para consultar todos los tipos de datos que podemos utilizar podis consultar la
documentacin de Laravel en:
http://laravel.com/docs/5.1/migrations#creating-columns
Aadir ndices
Schema soporta los siguientes tipos de ndices:
Schema Builder 77
Laravel 5
Comando Descripcin
En la tabla se especifica como aadir estos ndices despus de crear el campo, pero
tambin permite indicar estos ndices a la vez que se crea el campo:
$table->string('email')->unique();
Claves ajenas
Con Schema tambin podemos definir claves ajenas entre tablas:
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
En este ejemplo en primer lugar aadimos la columna " user_id " de tipo UNSIGNED
INTEGER (siempre tendremos que crear primero la columna sobre la que se va a aplicar la
clave ajena). A continuacin creamos la clave ajena entre la columna " user_id " y la
columna " id " de la tabla " users ".
La columna con la clave ajena tiene que ser del mismo tipo que la columna a la que
apunta. Si por ejemplo creamos una columna a un ndice auto-incremental tendremos
que especificar que la columna sea unsigned para que no se produzcan errores.
Tambin podemos especificar las acciones que se tienen que realizar para "on delete" y "on
update":
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
Para eliminar una clave ajena, en el mtodo down de la migracin tenemos que utilizar el
siguiente cdigo:
$table->dropForeign('posts_user_id_foreign');
Schema Builder 78
Laravel 5
Para indicar la clave ajena a eliminar tenemos que seguir el siguiente patrn para
especificar el nombre <tabla>_<columna>_foreign . Donde "tabla" es el nombre de la tabla
actual y "columna" el nombre de la columna sobre la que se creo la clave ajena.
Schema Builder 79
Laravel 5
<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
1. Escribir el cdigo para insertar los datos dentro del propio mtodo run .
2. Crear otros mtodos dentro de la clase DatabaseSeeder y llamarlos desde el mtodo
run . De esta forma podemos separar mejor las inicializaciones.
3. Crear otros ficheros Seeder y llamarlos desde el mtodo run es la clase principal.
Segn lo que vayamos a hacer nos puede interesar una opcin u otra. Por ejemplo, si el
cdigo que vamos a escribir es poco nos puede sobrar con las opciones 1 o 2, sin embargo
si vamos a trabajar bastante con las inicializaciones quizs lo mejor es la opcin 3.
Inicializacin de la BD 80
Laravel 5
Como se puede ver en el ejemplo en general tendremos que eliminar primero los datos de
la tabla en cuestin y posteriormente aadir los datos. Para insertar datos en una tabla
podemos utilizar el mtodo que se usa en el ejemplo o alguna de las otras opciones que se
vern en las siguientes secciones sobre "Constructor de consultas" y "Eloquent ORM".
En la carpeta database/seeds podemos aadir ms ficheros PHP con clases que extiendan
de Seeder para definir nuestros propios ficheros de "semillas". El nombre de los ficheros
suele seguir el mismo patrn <nombre-tabla>TableSeeder , por ejemplo " UsersTableSeeder ".
Artisan incluye un comando que nos facilitar crear los ficheros de semillas y que adems
incluirn las estructura base de la clase. Por ejemplo, para crear el fichero de inicializacin
de la tabla de usuarios haramos:
Para que esta nueva clase se ejecute tenemos que llamarla desde el mtodo run de la
clase principal DatabaseSeeder de la forma:
Inicializacin de la BD 81
Laravel 5
$this->call(UsersTableSeeder::class);
Model::reguard();
}
}
El mtodo call lo que hace es llamar al mtodo run de la clase indicada. Adems en el
ejemplo hemos aadido las llamadas a unguard y a reguard , que lo que hacen es
desactivar y volver a activar (respectivamente) la insercin de datos masiva o por lotes.
Inicializacin de la BD 82
Laravel 5
Consultas
Para realizar una "Select" que devuelva todas las filas de una tabla utilizaremos el siguiente
cdigo:
$users = DB::table('users')->get();
$user = DB::table('users')->first();
echo $user->name;
Clausula where
Para filtrar los datos usamos la clausula where , indicando el nombre de la columna y el
valor a filtrar:
Constructor de consultas 83
Laravel 5
echo $user->name;
En este ejemplo, la clausula where filtrar todas las filas cuya columna name sea igual a
Pedro . Si queremos realizar otro tipo de filtrados, como columnas que tengan un valor
mayor ( > ), mayor o igual ( >= ), menor ( < ), menor o igual ( <= ), distinto del indicado
( <> ) o usar el operador like , lo podemos indicar como segundo parmetro de la forma:
$users = DB::table('users')
->where('votes', '>', 100)
->orWhere('name', 'Pedro')
->get();
$users = DB::table('users')
->orderBy('name', 'desc')
->groupBy('count')
->having('count', '>', 100)
->get();
Offset / Limit
Si queremos indicar un offset o limit lo realizaremos mediante los mtodos skip (para el
offset) y take (para limit), por ejemplo:
$users = DB::table('users')->skip(10)->take(5)->get();
Constructor de consultas 84
Laravel 5
Transacciones
Laravel tambin permite crear transacciones sobre un conjunto de operaciones:
DB::transaction(function()
{
DB::table('users')->update(array('votes' => 1));
DB::table('posts')->delete();
});
Ms informacion
Para ms informacin sobre la construccin de Querys (join, insert, update, delete,
agregados, etc.) podis consultar la documentacin de Laravel en su sitio web:
http://laravel.com/docs/5.1/queries
Constructor de consultas 85
Laravel 5
Laravel incluye su propio sistema de ORM llamado Eloquent, el cual nos proporciona una
manera elegante y fcil de interactuar con la base de datos. Para cada tabla de la base
datos tendremos que definir su correspondiente modelo, el cual se utilizar para interactuar
desde cdigo con la tabla.
Definicin de un modelo
Por defecto los modelos se guardarn como clases PHP dentro de la carpeta app , sin
embargo Laravel nos da libertad para colocarlos en otra carpeta si queremos, como por
ejemplo la carpeta app/Models . Pero en este caso tendremos que asegurarnos de indicar
correctamente el espacio de nombres.
Para definir un modelo que use Eloquent nicamente tenemos que crear una clase que
herede de la clase Model :
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
Sin embargo es mucho ms fcil y rpido crear los modelos usando el comando
make:model de Artisan:
Eloquent ORM 86
Laravel 5
Este comando crear el fichero User.php dentro de la carpeta app con el cdigo bsico
de un modelo que hemos visto en el ejemplo anterior.
Convenios en Eloquent
Nombre
En general el nombre de los modelos se pone en singular con la primera letra en
mayscula, mientras que el nombre de las tablas suele estar en plural. Gracias a esto, al
definir un modelo no es necesario indicar el nombre de la tabla asociada, sino que Eloquent
automticamente buscar la tabla transformando el nombre del modelo a minsculas y
buscando su plural (en ingls). En el ejemplo anterior que hemos creado el modelo User
buscar la tabla de la base de datos llamada users y en caso de no encontrarla dara un
error.
Si la tabla tuviese otro nombre lo podemos indicar usando la propiedad protegida $table
del modelo:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
Clave primaria
Laravel tambin asume que cada tabla tiene declarada una clave primaria con el nombre
id . En el caso de que no sea as y queramos cambiarlo tendremos que sobrescribir el
Timestamps
Eloquent ORM 87
Laravel 5
Otra propiedad que en ocasiones tendremos que establecer son los timestamps
automticos. Por defecto Eloquent asume que todas las tablas contienen los campos
updated_at y created_at (los cuales los podemos aadir muy fcilmente con Schema
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use App\User;
use App\Orders;
Consultar datos
Para obtener todas las filas de la tabla asociada a un modelo usaremos el mtodo all() :
Eloquent ORM 88
Laravel 5
$users = User::all();
Este mtodo nos devolver un array de resultados, donde cada item del array ser una
instancia del modelo User . Gracias a esto al obtener un elemento del array podemos
acceder a los campos o columnas de la tabla como si fueran propiedades del objeto
( $user->name ).
Eloquent tambin incorpora el mtodo find($id) para buscar un elemento a partir del
identificador nico del modelo, por ejemplo:
$user = User::find(1);
echo $user->name;
$model = User::findOrFail(1);
A continuacin se incluyen otros ejemplos de consultas usando Eloquent con algunos de los
mtodos que ya habamos visto en la seccin "Constructor de consultas":
Tambin podemos utilizar los mtodos agregados para calcular el total de registros
obtenidos, o el mximo, mnimo, media o suma de una determinada columna. Por ejemplo:
Eloquent ORM 89
Laravel 5
Insertar datos
Para aadir una entrada en la tabla de la base de datos asociada con un modelo
simplemente tenemos que crear una nueva instancia de dicho modelo, asignar los valores
que queramos y por ltimo guardarlos con el mtodo save() :
$insertedId = $user->id;
Actualizar datos
Para actualizar una instancia de un modelo es muy sencillo, solo tendremos que recuperar
en primer lugar la instancia que queremos actualizar, a continuacin modificarla y por ltimo
guardar los datos:
$user = User::find(1);
$user->email = '[email protected]';
$user->save();
Borrar datos
Para borrar una instancia de un modelo en la base de datos simplemente tenemos que usar
su mtodo delete() :
$user = User::find(1);
$user->delete();
Eloquent ORM 90
Laravel 5
Si por ejemplo queremos borrar un conjunto de resultados tambin podemos usar el mtodo
delete() de la forma:
Ms informacin
Para ms informacin sobre como crear relaciones entre modelos, eager loading, etc.
podis consultar directamente la documentacin de Laravel en:
http://laravel.com/docs/5.1/eloquent
Eloquent ORM 91
Laravel 5
Ejercicios
En estos ejercicios vamos a continuar con el proyecto del videoclub que habamos
empezado en sesiones anteriores y le aadiremos todo lo referente a la gestin de la base
de datos.
Nota: XAMPP por defecto crea el usuario de base de datos root sin contrasea.
Si nos diese algn error tendremos que revisar los valores indicados en el fichero
.env . En caso de ser correctos es posible que tambin tengamos que reiniciar el
Ahora vamos a crear la tabla que utilizaremos para almacenar el catlogo de pelculas.
Ejecuta el comando de Artisan para crear la migracin llamada create_movies_table para la
tabla movies . Una vez creado edita este fichero para aadir todos los campos necesarios,
estos son:
Ejercicios 92
Laravel 5
id Autoincremental
title String
year String de longitud 8
Recuerda que en el mtodo down de la migracin tienes que deshacer los cambios
que has hecho en el mtodo up , en este caso sera eliminar la tabla.
Por ltimo ejecutaremos el comando de Artisan que aade las nuevas migraciones y
comprobaremos en PHPMyAdmin que la tabla se ha creado correctamente con los campos
que le hemos indicado.
Una vez creado este fichero lo abriremos y comprobaremos que el nombre de la clase sea
el correcto y que herede de la clase Model . Y ya est, no es necesario hacer nada ms, el
cuerpo de la clase puede estar vaco ( {} ), todo lo dems se hace automticamente!
Ejercicios 93
Laravel 5
Por ltimo tendremos que ejecutar el comando de Artisan que procesa las semillas y una
vez realizado abriremos PHPMyAdmin para comprobar que se rellenado la tabla movies con
el listado de pelculas.
Si te aparece el error "Fatal error: Class 'Movie' not found" revisa si has indicado el
espacio de nombres del modelo que vas a utilizar ( use App\Movie; ).
Modificar el mtodo getIndex para que obtenga toda la lista de pelculas desde la
base de datos usando el modelo Movie y que se la pase a la vista.
Ejercicios 94
Laravel 5
Modificar el mtodo getShow para que obtenga la pelcula pasada por parmetro
usando el mtodo findOrFail y se la pase a la vista.
Modificar el mtodo getEdit para que obtenga la pelcula pasada por parmetro
usando el mtodo findOrFail y se la pase a la vista.
Ahora tendremos que actualizar las vistas para que en lugar de acceder a los datos del
array los obtenga del objeto con la pelcula. Para esto cambiaremos en todos los sitios
donde hayamos puesto $pelicula['campo'] por $pelicula->campo .
Ejercicios 95
Laravel 5
Captulo 4.
Datos de entrada y Control de usuarios
En este cuarto captulo vamos a aprender como recoger los datos de entrada de formularios
o de algn otro tipo de peticin (como por ejemplo una peticin de una API). Tambin
veremos como leer ficheros de entrada.
Datos de entrada
Laravel facilita el acceso a los datos de entrada del usuario a travs de solo unos pocos
mtodos. No importa el tipo de peticin que se haya realizado (POST, GET, PUT, DELETE),
si los datos son de un formulario o si se han aadido a la query string, en todos los casos se
obtendrn de la misma forma.
Para conseguir acceso a estos mtodos Laravel utiliza inyeccin de dependencias. Esto es
simplemente aadir la clase Request al constructor o mtodo del controlador en el que lo
necesitemos. Laravel se encargar de inyectar dicha dependencia ya inicializada y
directamente podremos usar el parmetro para obtener los datos de entrada. A continuacin
se incluye un ejemplo:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
//...
}
}
En este ejemplo como se puede ver se ha aadido la clase Request como parmetro al
mtodo store . Laravel automticamente se encarga de inyectar estas dependencias por lo
que directamente podemos usar la variable $request para obtener los datos de entrada.
Si el mtodo del controlador tuviera ms parmetros simplemente los tendremos que aadir
a continuacin de las dependencias, por ejemplo:
A continuacin veremos los mtodos y datos que podemos obtener a partir de la variable
$request .
Datos de entrada 97
Laravel 5
$name = $request->input('name');
if ($request->has('name'))
{
//...
}
// Obtener todos:
$input = $request->all();
Datos de entrada 98
Laravel 5
$input = $request->input('products.0.name');
JSON
Si la entrada est codificada formato JSON (por ejemplo cuando nos comunicamos a travs
de una API es bastante comn) tambin podremos acceder a los diferentes campos de los
datos de entrada de forma normal (con los mtodos que hemos visto, por ejemplo: $name =
$request->input('name'); ).
Ficheros de entrada
Laravel facilita una serie de clases para trabajar con los ficheros de entrada. Por ejemplo
para obtener un fichero que se ha enviado en el campo con nombre photo y guardarlo en
una variable, tenemos que hacer:
$file = $request->file('photo');
if ($request->hasFile('photo')) {
{
//...
}
muchos mtodos que podemos utilizar para obtener datos del fichero o para gestionarlo.
if ($request->file('photo')->isValid())
{
//...
}
Datos de entrada 99
Laravel 5
Otros mtodos que podemos utilizar para recuperar informacin del fichero son:
// Obtener la ruta:
$path = $request->file('photo')->getRealPath();
// Obtener la extensin:
$extension = $request->file('photo')->getClientOriginalExtension();
// Obtener el tamao:
$size = $request->file('photo')->getSize();
Control de usuarios
Laravel incluye una serie de mtodos y clases que harn que la implementacin del control
de usuarios sea muy rpida y sencilla. De hecho, casi todo el trabajo ya est hecho, solo
tendremos que indicar donde queremos utilizarlo y algunos pequeos detalles de
configuracin.
Configuracin inicial
La configuracin del sistema de autenticacin se puede encontrar en el fichero
config/auth.php , el cual contiene varias opciones (bien documentadas) que nos permitirn,
por ejemplo: cambiar el sistema de autenticacin (que por defecto es a travs de Eloquent),
cambiar el modelo de datos usado para los usuarios (por defecto ser User ) y cambiar la
tabla de usuarios (que por defecto ser users ). Si vamos a utilizar estos valores no ser
necesario que realicemos ningn cambio.
La migracin de la tabla de usuarios (llamada users ) tambin est incluida (ver carpeta
database/migrations ). Por defecto incluye todos los campos necesarios (ver el cdigo
En la carpeta app se encuentra el modelo de datos (llamado User.php ) para trabajar con
los usuarios. Esta clase ya incluye toda la implementacin necesaria y por defecto no
tendremos que modificar nada. Pero si queremos podemos modificar esta clase para
aadirle ms mtodos o relaciones con otras tablas, etc.
Lo nico que falta por aadir y configurar correctamente para que todo funcione son las
rutas y las vistas. A continuacin veremos estos puntos.
Rutas
Por defecto Laravel no incluye ninguna ruta para el control de usuarios (ya que muchas
aplicaciones no requerirn de estas o querrn poner las suyas propias). Si lo deseamos
podemos aadir las siguientes rutas al fichero app/Http/routes.php para gestionar las
acciones de acceso de usuarios (login), cerrar sesin (logout) y registro:
Por ltimo lo que nos falta por definir son los formularios o vistas que se mostrarn al
acceder a estas rutas.
Vistas
Aunque los mtodos de los controladores ya estn definidos, Laravel no proporciona el
contenido de las vistas a mostrar, por lo tanto las tendremos que aadir nosotros mismos.
Estas vistas se tienen que almacenar en la carpeta resources/views/auth con los nombres
login.blade.php para el formulario de login y register.blade.php para el formulario de
registro. Estos nombres y rutas son obligatorios ya que los controladores que incluye
Laravel accedern a ellos.
<div>
<label for="email">Email</label>
<input type="email" name="email" id="email" value="{{ old('email') }}">
</div>
<div>
<label for="password">Contrasea</label>
<input type="password" name="password" id="password">
</div>
<div>
<input type="checkbox" name="remember"> Recurdame
</div>
<div>
<button type="submit">Entrar</button>
</div>
</form>
<div>
<label for="name">Nombre</label>
<input type="text" name="name" id="name" value="{{ old('name') }}">
</div>
<div>
<label for="email">Email</label>
<input type="email" name="email" id="email" value="{{ old('email') }}">
</div>
<div>
<label for="password">Contrasea</label>
<input type="password" name="password" id="password">
</div>
<div>
<label for="password_confirmation">Confirmar contrasea</label>
<input type="password" name="password_confirmation" id="password_confirmation">
</div>
<div>
<button type="submit">Registrar</button>
</div>
</form>
Autenticacin de un usuario
Una vez configurado todo el sistema, aadidas las rutas y las vistas para realizar el control
de usuarios ya podemos utilizarlo. Si accedemos a la ruta auth/login nos aparecer la
vista con el formulario de login, solicitando nuestro email y contrasea para acceder. Si
adems aadimos un campo tipo checkbox llamado "remember" nos permitir indicar si
deseamos que la sesin permanezca abierta hasta que se cierre manualmente. Es decir,
aunque se cierre el navegador y pasen varios das el usuario seguira estando autorizado.
Si los datos introducidos son correctos se crear la sesin del usuario y se le redirigir a la
ruta " /home ". Si queremos cambiar esta ruta tenemos que definir la propiedad
redirectPath en el controlador AuthController , por ejemplo:
Si los datos del usuario no son correctos se le volver a redirigir a la ruta con el formulario
de login ( /auth/login ). Si por alguna razn hubiramos cambiado dicha ruta lo tendremos
que indicar tambin definiendo la propiedad loginPath en el controlador AuthController
por ejemplo:
Registro de un usuario
Si accedemos a la ruta auth/register nos aparecer la vista con el formulario de registro,
solicitndonos los campos nombre, email y contrasea. Al pulsar el botn de envo del
formulario se llamar a la ruta auth/register por POST y se almacenar el nuevo usuario
en la base de datos.
Como podemos ver utiliza el modelo de datos User para crear el usuario y almacenar las
variables que recibe en el array de datos $data . En este array de datos nos llegarn todos
los valores de los campos del formulario, por lo tanto, si aadimos ms campos al
formulario y a la tabla de usuarios simplemente tendremos que aadirlos tambin en este
mtodo.
Es importante destacar que la contrasea se cifra usando el mtodo bcrypt . Por lo tanto
las contraseas se almacenaran cifradas en la base de datos.
Una vez que el usuario est autenticado podemos acceder a los datos del mismo a travs
del mtodo Auth::user() , por ejemplo:
user = Auth::user();
Este mtodo nos devolver null en caso de que no est autenticado. Si estamos seguros
de que el usuario est autenticado (porque estamos en una ruta protegida) podremos
acceder directamente a sus propiedades:
$email = Auth::user()->email;
Importante: para utilizar la clase Auth tenemos que aadir el espacio de nombres use
Auth; , de otra forma nos aparecer un error indicando que no puede encontrar la
clase.
Cerrar la sesin
Si accedemos a la ruta auth/logout que hemos definido antes se cerrar la sesin y se
redirigir a la ruta de home . Todo esto lo har automticamente el mtodo getLogout del
controlador AuthController .
Para cerrar manualmente la sesin del usuario actualmente autenticado tenemos que
utilizar el mtodo:
Auth::logout();
Posteriormente podremos hacer una redireccin a una pgina principal para usuarios no
autenticados.
Importante: para utilizar la clase Auth tenemos que aadir el espacio de nombres use
Auth; , de otra forma nos aparecer un error indicando que no puede encontrar la
clase.
if (Auth::check())
{
// El usuario est correctamente autenticado
}
Importante: para utilizar la clase Auth tenemos que aadir el espacio de nombres use
Auth; , de otra forma nos aparecer un error indicando que no puede encontrar la
clase.
Proteger rutas
El sistema de autenticacin de Laravel tambin incorpora una serie de filtros o Middleware
(ver carpeta app/Http/Middleware ) para comprobar que el usuario que accede a una
determinada ruta o grupo de rutas est autenticado. En concreto para proteger el acceso a
rutas y solo permitir su visualizacin por usuarios correctamente autenticados usaremos el
middleware app\Http\Middleware\Authenticate.php cuyo alias es auth . Si el usuario que
accede no est validado se le redirigir a la ruta auth/login , si deseamos cambiar esta
direccin o realizar otra accin podemos modificar este filtro.
Para utilizar este middleware tenemos que editar el fichero app/Http/routes.php y modificar
las rutas o grupos de rutas que queramos proteger, por ejemplo:
Ejercicios
En los ejercicios de esta seccin vamos a completar el proyecto del videoclub terminando el
procesamiento de los formularios y aadiendo el sistema de autenticacin de usuarios.
Como hemos visto en la teora, Laravel ya incluye una migracin con el nombre
create_users_table para la tabla users con todos los campos necesarios. Vamos a abrir
esta migracin y a comprobar que los campos incluidos coinciden con los de la siguiente
tabla:
id Autoincremental
name String
email String unique
password String de longitud 60
remember_token Campo remember_token
Comprueba tambin que en el mtodo down de la migracin se deshagan los cambios que
se hacen en el mtodo up , en este caso sera eliminar la tabla.
Por ltimo usamos el comando de Artisan que aade las nuevas migraciones y
comprobamos con PHPMyAdmin que la tabla se ha creado correctamente con todos
campos indicados.
Ejercicios 110
Laravel 5
self::seedUsers();
$this->command->info('Tabla usuarios inicializada con datos!');
}
Por ltimo tendremos que ejecutar el comando de Artisan que procesa las semillas. Una vez
realizado esto comprobamos en PHPMyAdmin que se han aadido los usuarios a la tabla
users.
Aade las rutas necesarias para realizar el login y logout (revisa la teora). Dos de
estas rutas ya las tenamos definidas para que devolvieran una vista, cambialas para
que apunten a los mtodos apropiados del controlador AuthController y aade
tambin la ruta tipo POST que falta.
Aadimos un middleware de tipo grupo que aplique el filtro auth para proteger todas
las rutas menos la raz / y la de /auth/login .
Ejercicios 111
Laravel 5
Una ruta de tipo POST para la url catalog/create que apuntar al mtodo postCreate
del controlador CatalogController .
Y otra ruta tipo PUT para la url catalog/edit/{id} que apuntar al mtodo putEdit
del controlador CatalogController .
Por ltimo tenemos que actualizar el controlador CatalogController con los dos nuevos
mtodos. En ambos casos tenemos que usar la inyeccin de dependencias para aadir la
clase Request como parmetro de entrada (revisa la seccin "Datos de entrada" de la
teora). Adems para cada mtodo haremos:
En el mtodo postCreate creamos una nueva instancia del modelo Movie , asignamos
el valor de todos los campos de entrada (title, year, director, poster y synopsis) y los
guardamos. Por ltimo, despus de guardar, hacemos una redireccin a la ruta
/catalog .
Ejercicios 112
Laravel 5
actualizamos sus campos y los guardamos. Por ltimo realizamos una redireccin a la
pantalla con la vista detalle de la pelcula editada.
Ejercicios 113
Laravel 5
Captulo 5.
Paquetes, Rest y Curl
En este captulo en primer lugar vamos a ver como instalar paquetes adicionales en
Laravel. Esta opcin nos permitir, de forma muy sencilla, ampliar la funcionalidad de
nuestra web y aprovechar cdigo de libreras de terceros.
A continuacin se ver como crear una interfaz tipo RESTful para por ejemplo implementar
una API y como probar estos mtodos mediante cURL. Adems tambin veremos como
utilizar la autenticacin HTTP bsica para proteger una API (o una Web) con usuario y
contrasea, y algunos tipos de respuestas especiales de Laravel que nos sern tiles a la
hora de implementar una API.
Instalacin de paquetes
Adems de todas las utilidades que incorpora Laravel y que podemos utilizar directamente
sin instalar nada ms, tambin nos permite aadir de forma muy sencilla paquetes para
complementar su funcionalidad.
Esta ltima opcin es ms interesante ya que nos permitir una mayor configuracin, por
ejemplo, indicar la versin del paquete o repositorio, etc.
Modelos auto-
Ardent https://github.com/laravelbook/ardent
validados
Extensin para https://github.com/jenssegers/laravel-
MongoDB
soportar MongoDB mongodb
Una vez aadido el paquete tendremos que modificar tambin el fichero de configuracin
config/app.php , en su seccin providers y aliases , para que la plataforma encuentre el
"edvinaskrucas/notification": "5.*"
Krucas\Notification\NotificationServiceProvider::class,
\Krucas\Notification\Middleware\NotificationMiddleware::class,
Con esto ya tendramos instalada esta librera y podramos empezar a utilizarla. Por
ejemplo, para aadir una notificacin desde un controlador podemos utilizar los siguientes
mtodos:
Notification::success('Success message');
Notification::error('Error message');
Notification::info('Info message');
Notification::warning('Warning message');
Y para mostrar las notificaciones, desde una vista (preferiblemente desde el layout
principal), aadiramos el siguiente cdigo:
O tambin podemos usar la extensin que incorpora para Blade y simplemente aadir:
@notification()
Route::resource('photo', 'PhotoController');
Esta lnea de ruta crea por si sola mltiples rutas para gestionar todos los tipos de
peticiones RESTful. Adems, el controlador creado mediante Artisan estar preparado con
todos los mtodos necesarios para responder a todos los tipos de peticiones. En la
siguiente tabla se muestra un resumen de todas las rutas generadas, el tipo de peticin a la
que responden y la accin que realizan en el controlador:
Route::resource('photo', 'PhotoController',
['only' => ['index', 'show']]);
Route::resource('photo', 'PhotoController',
['except' => ['create', 'store', 'update', 'destroy']]);
Los mtodos que no utilicemos los podremos borrar del cdigo generado para el
controlador.
Middleware
Para aadir middleware a un controlador tipo recurso tenemos dos opciones. La primera es
definir un grupo que englobe a la ruta, por ejemplo:
Route::resource('photos.comments', 'PhotoCommentController');
Las rutas generadas para este tipo de recursos siguen el siguiente patrn:
photos/{photoResource}/comments/{commentResource} , donde se tiene que especificar el
Los controladores asociados recibiran en este caso dos identificadores, primero el del
recurso base y segundo el del recurso anidado:
Route::get('photos/popular', 'PhotoController@getPopular');
Route::resource('photos', 'PhotoController');
Por ejemplo, para realizar una peticin tipo GET a una URL simplemente tenemos que
hacer:
$ curl -i http://localhost/recurso
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Fri, 27 Jul 2012 05:11:00 GMT
Content-Type: text/plain
Hola Mundo!
HTTP/1.1 200 OK
Date: Fri, 27 Jul 2012 05:12:32 GMT
Cache-Control: max-age=42
Content-Type: application/json
Content-Length: 27
{
"text": "Hola Mundo!"
}
Como hemos visto por defecto se realiza una peticin tipo GET. Si queremos realizar otro
tipo de peticin lo tendremos que indicar con el parmetro -X seguido del mtodo a utilizar
(POST, PUT, DELETE). Adems, con la opcin -d podemos aadir los parmetros de la
peticin. Los parmetros tendrn que ir entre comillas y en caso de indicar varios los
separaremos con & . Por ejemplo, para realizar una peticin tipo POST con dos
parmetros:
De la misma forma podemos hacer una peticin tipo PUT (para actualizar datos) o tipo
DELETE (para eliminarlos). Por ejemplo:
Para aadir ms de una cabecera tenemos que indicar varias veces la opcin -H , por
ejemplo:
Por ejemplo, si queremos realizar una peticin tipo POST que enve cdigo JSON y que
tambin espere la respuesta en JSON tendramos que indicar ambas cabeceras y aadir el
JSON que queramos en los parmetros con -d de forma normal:
Opcin Descripcin
-i Mostrar las cabeceras de respuesta
-H
"header" Configurar las cabeceras de la peticin
Plugins o extensiones
Adems de curl tambin podemos utilizar otro tipo de programas para probar una API. En
Firefox y Chrome podemos encontrar extensiones que nos facilitarn este tipo de trabajo.
Por ejemplo, en Firefox podemos encontrar:
HttpRequester: https://addons.mozilla.org/en-US/firefox/addon/httprequester/
Poster: https://addons.mozilla.org/en-US/firefox/addon/poster/
Una vez instalado los podremos abrir desde el men Herramientas , y utilizarlo a travs de
una interfaz visual muy sencilla.
Pero es ms comn su utilizacin para proteger las rutas de una API. En este caso las
credenciales se tendran que enviar en la cabecera de la peticin.
Para proteger una ruta usando el sistema de autenticacin bsico simplemente tenemos
que aadir el filtro llamado auth.basic a la ruta o grupo de rutas, de la forma:
Por defecto este filtro utiliza la columna email de la tabla de usuarios para la validacin.
Una vez superada la autenticacin bsica se crea la sesin del usuario y en cliente se
almacenara una cookie con el identificador de la sesin.
Laravel no trae un Middleware por defecto para la autenticacin sin estado pero lo podemos
crear rpidamente. En primer lugar ejecutamos el comando de Artisan para crear un nuevo
middleware:
A continuacin editamos la nueva clase creada para que tenga el siguiente contenido:
<?php
namespace Illuminate\Auth\Middleware;
use Auth;
use Closure;
class AuthenticateOnceWithBasicAuth
{
public function handle($request, Closure $next)
{
return Auth::onceBasic() ?: $next($request);
}
}
Bsicamente lo que tenemos que aadir es el espacio de nombres use Auth; y la lnea
que realiza la validacin dentro de la funcin handle . La funcin onceBasic lanza la
autenticacin y en caso de que sea correcta permitir continuar con la peticin, y en otro
caso devolver un error de autenticacin.
Por ltimo nos faltara registrar el middleware para poder utilizarlo. Para esto abrimos el
fichero app/Http/Kernel.php y aadimos la siguiente lnea al array de routeMiddleware :
$user = User::first();
$arrayUsuario = $user->toArray();
$jsonUsuario = $user->toJson();
Tambin podemos transformar una coleccin entera de datos a este formato, por ejemplo:
$arrayUsuarios = User::all()->toArray();
$jsonUsuarios = User::all()->toJson();
Respuestas especiales
Con lo que hemos visto en la seccin anterior solo se realizara la transformacin a JSON,
pero si queremos devolverlo como respuesta de una peticin (por ejemplo, como respuesta
a una peticin de un mtodo de una API), tendremos que utilizar el mtodo response()-
>json() , el cual adems aadir en la cabecera de la respuesta que los datos enviados
$usuarios = User::all();
Este mtodo tambin puede recibir otro tipo de valores (como una variable, un array, etc.) y
los transformar tambin a JSON para devolverlos como respuesta a la peticin:
La lista completa de los cdigos que podemos utilizar la podis encontrar en:
http://es.wikipedia.org/wiki/Anexo:C%C3%B3digos_de_estado_HTTP
Ejercicios
En esta seccin de ejercicios vamos a terminar la web de gestin del videoclub aadiendo
notificaciones, el funcionamiento de algunos botones que faltaban y por ltimo, una API tipo
RESTful para el acceso externo.
Una vez instalado y correctamente configurado vamos a modificar los controladores para
mostrar un aviso tipo success despus de guardar y editar una pelcula. La notificacin se
tendr que aadir antes de realizar la redireccin. Le podis poner los textos: "La pelcula
se ha guardado/modificado correctamente".
<div class="container">
@notification()
@yield('content')
</div>
Ejercicios 130
Laravel 5
En primer lugar tenis que aadir las rutas al fichero routes.php y posteriormente modificar
el controlador CatalogController para aadir los tres nuevos mtodos. Estos tres mtodos
son similares al mtodo que ya habamos implementado antes para editar los datos de una
pelcula. En el caso de putRent y putReturn nicamente modificaremos el campo rented
asignndole el valor true y false respectivamente, y una vez guardado aadiremos la
notificacin y realizaremos una redireccin a la pantalla con la vista detalle de la pelcula.
En el mtodo deleteMovie tambin obtendremos el registro de la pelcula pero tendremos
que llamar al mtodo delete() de la misma, una vez hecho esto aadiremos la notificacin
y realizaremos una redireccin al listado general de pelculas.
A continuacin tenemos que editar la vista detalle de pelculas para modificar los botones
( resources/views/catalog/show.blade.php ). Dado que la acciones se tienen que realizar
usando peticiones HTTP tipo PUT y DELETE no podemos poner un enlace normal (ya que
este sera tipo GET). Para solucionarlo tenemos que crear un formulario alrededor del botn
y asignar al formulario el mtodo correspondiente, por ejemplo:
Ejercicios 131
Laravel 5
Como se ve en la tabla, tendremos que definir todas las rutas RESTful para el catlogo,
adems de dos especiales: /rent y /return . Todas las rutas estarn protegidos con
contrasea (usando autenticacin HTTP bsica sin estado) a excepcin de index y show
que sern pblicas. Tenis que comprobar que las rutas y filtros sean los correctos usando
el mtodo de Artisan php artisan route:list .
Pista 2: Para poder aplicar un filtro solamente a algunos de los mtodos del controlador
tendris que separar la declaracin de las rutas. Para esto podis utilizar el tercer
parmetro con las opciones only y except .
Para devolver una respuesta en los mtodos que realizan alguna accin (por ejemplo para
indicar que la pelcula se ha marcado como alquilada o que se ha modificado
correctamente) podemos realizar lo siguiente:
Ejercicios 132
Laravel 5
Por ltimo, utiliza cURL para comprobar que todas las rutas que has creado funcionan
correctamente. Recuerda que para enviar
Aviso: hemos de tener cuidado con el mtodo de actualizar los datos de una pelcula,
ya que los campos que no se enven se asignarn como vacos. Para solucionar esto
podemos actualizar solamente los campos que contengan algn valor o enviar siempre
todos los campos.
Ejercicios 133