Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso
Framework Laravel Básico
Introducción
Bienvenido al Curso Básico de Laravel, en esta ocasión explicaremos los fundamentos del
framework Laravel a partir de la versión 5.5 LTS, incluyendo el ORM Eloquent, su sistema
de migraciones, seeders y constructor de consultas, el sistema de plantillas Blade, rutas,
controladores y mucho más; estos fundamentos son compatibles con las versiones siguientes
del framework.
Para finalizar el curso crearemos un sencillo pero funcional módulo CRUD de usuarios que
podrás implementar en tus proyectos.
Tabla de contenido
Primeros pasos con Laravel ............................................................................ 5
Instalación de Composer y Laravel .................................................................................... 5
Introducción a Laravel ....................................................................................................... 8
Rutas con Laravel ............................................................................................................. 10
Pruebas ............................................................................................................................. 12
Controladores en Laravel ................................................................................................. 15
Vistas ............................................................................................................... 18
Vistas en Laravel .............................................................................................................. 18
Blade, el Sistema de plantillas de Laravel........................................................................ 20
Layouts con Blade ............................................................................................................ 25
Manejo de Bases de datos con Laravel ........................................................ 29
Introducción a las bases de datos y migraciones con Laravel .......................................... 29
Modificar tablas ya existentes con las migraciones de Laravel ....................................... 35
Crear y asociar tablas usando las migraciones de Laravel (con claves foráneas) ............ 39
Inserción de datos con los seeders de Laravel.................................................................. 43
Constructor de consultas SQL de Laravel ........................................................................ 48
Introducción a Eloquent, el ORM del framework Laravel............................................... 53
Usando Eloquent ORM de forma interactiva con Tinker ................................................ 57
Manejo de atributos en Eloquent ORM (solución a MassAssignmentException) ........... 61
Manejo de relaciones con el ORM Eloquent ................................................................... 64
Generar registros usando Model Factories en Laravel ..................................................... 67
Módulo CRUD de usuarios: listado básico y detalles ................................. 72
Módulo de usuarios con Laravel ...................................................................................... 72
Listado dinámico de Usuarios con Laravel (Módulo CRUD).......................................... 72
A esto nosotros le llamamos entorno de desarrollo y existe una gran variedad de ellos, cada
uno con un nivel de complejidad distinto al otro, desde el más básico instalando manualmente
Apache o Nginx, PHP, MySQL, etc., así como instalar herramientas como XAMPP, WAMP,
MAMP, etc., hasta otras más complicadas como Laravel Homestead
Sin embargo, recomendamos las siguientes opciones para quienes estén iniciando, por su
facilidad de instalación y uso:
Instalarlo depende del sistema operativo que uses si es MacOs o Linux se tiene que descargar
el archivo composer.phar con las instrucciones del sitio oficial y luego mover dicho archivo
para que esté de forma global y así usar la herramienta desde cualquier directorio, siguiendo
las instrucciones oficiales de Composer.
Para Windows puedes descargar el instalador que ofrece Composer en su sitio web que se
encargará de instalarlo para que lo puedas usar en cualquier parte del sistema. Si has decidido
trabajar con Laragon no necesitas realizar esta instalación, puesto que viene incluido por
defecto en este entorno de desarrollo.
Puedes confirmar si tienes bien instalado Composer ejecutando en la consola desde cualquier
directorio: composer y en caso de estar instalado, te mostrará un listado de todos los
comandos disponibles.
Instalación de Laravel
Una vez listo el entorno de desarrollo, usaremos Composer para instalar Laravel de esta
manera:
Lo que significa que estamos creando un nuevo proyecto llamado mi-proyecto con el
comando create-project de Composer a partir del paquete laravel/laravel, usando la
opción --prefer-dist para que Composer descargue los archivos del repositorio de
distribución.
Luego, nos tenemos que asegurar que la variable de entorno PATH del sistema operativo
tenga incluido el directorio donde se alojan los paquetes instalados globalmente y así se
puedan ejecutar sin ningún problema, para ello debemos agregar su ruta:
• Para MacOs y Linux la variable PATH la podemos definir en: ~/.bashrc o ~/.bash_profile
donde la ruta a añadir al final de lo que tiene asignado la variable es:
:$HOME/.composer/vendor/bin
• Para Windows debes modificar la variable de entorno PATH para agregar la ruta
;C:\Users\tu-usuario\AppData\Roaming\Composer\vendor\bin
Bien, de esta manera ya tenemos disponible el instalador de Laravel, por tanto, podemos
ejecutar desde cualquier directorio:
Nota:
Si estás usando el entorno de desarrollo Laravel Valet (tanto para Linux como para MacOs)
o Laragon, estás herramientas crean un virtualhost por defecto por cada proyecto según el
nombre de la carpeta. Así para nuestro proyecto creado podemos visitar en el navegador
http://mi-proyecto.dev y podrás ver la aplicación funcionando.
Introducción a Laravel
Laravel es un framework para el desarrollo de aplicaciones web con PHP que nos permite
construir aplicaciones modernas con una sintaxis elegante y expresiva. Éste fue creado por
Taylor Otwell en el 2011 y a la fecha de publicación de este curso va por la versión 5.5. Para
empezar a trabajar con Laravel necesitas preparar tu entorno de desarrollo, IDE o editor de
texto y otras herramientas como Composer que te ayudarán a instalar y desarrollar
aplicaciones web con este framework. En esta lección, daremos una breve introducción al
framework y aprenderás sobre el patrón de diseño Front Controller, el cual es usado por
Laravel para procesar todas las peticiones que se hacen a la aplicación.
Nota
Si la ruta del home / funciona pero ninguna otra y estás utilizando el Servidor Web Apache,
asegúrate de tener instalado y habilitada la extensión mod_rewrite.
Para instalar un nuevo proyecto de Laravel puedes hacerlo de 2 maneras: con el comando
create-project de Composer o con el instalador laravel new.
El instalador de Laravel solo nos permite instalar la versión actual del framework (opción
por defecto) y la versión en desarrollo con el comando laravel new mi-proyecto --dev
Por otro lado, algo clave para desarrollar eficientemente es tener un editor de texto o IDE
bien configurado que nos facilite el trabajo de escribir el código de nuestra aplicación. Hay
dos grandes grupos: IDE (Entorno de Desarrollo Integrado) y editores de texto. La diferencia
principal es que los primeros vienen por defecto con múltiples herramientas como:
autocompletado inteligente, resaltado de sintaxis, sistema de control de versiones, debugger,
entre otras herramientas configuradas y listas para empezar a trabajar. En cambio, los
editores de texto son más ligeros y no vienen con todas las herramientas u opciones listas por
defecto, sino que debes instalarlas y configurarlas por medio de plugins y extensiones.
Entre los IDEs para PHP tenemos a: PHPStorm, Zend Studio, Eclipse, NetBeans, Aptana
Studio, etc. Entre los editores de texto están: Sublime Text, Atom, Visual Studio Code,
NotePad++, etc.
El directorio public contiene además, las imágenes, archivos CSS y de Javascript que será
públicos para los usuarios y visitantes de la aplicación, el resto de archivos donde se
encuentra la lógica de la aplicación es inaccesible para ellos, es decir, son privados.
Las rutas son una capa muy importante en Laravel, es por ello que el Framework destina un
directorio en la carpeta raíz, llamado routes, para ubicar todas las rutas de la aplicación. Por
defecto, tiene 2 archivos de rutas web.php y api.php. Como sus nombres lo expresan en
web.php se definen las rutas para la web y en api.php las rutas para crear APIs para la
aplicación.
Podemos definir rutas de varias maneras, se puede implementar una función anónima, que
sigue el siguiente formato:
Se escribe la clase Route que llama al método relacionado con el verbo HTTP, en este caso,
get que acepta dos parámetros: el primero es la URL que se llamará desde el navegador y el
segundo es una función anónima que devuelve lo que queremos mostrar.
http://tu-proyecto.test/esta-es-la-url
Esto dependiendo de VirtualHost que se haya creado para el proyecto. Si no lo tienes puedes
usar php artisan serve.
En este caso Laravel se encarga de capturar el segmento de la ruta que es dinámico (lo
identifica porque está encerrado entre llaves). Por tanto, en la URL pasamos la identificación
del parámetro encerrado entre llaves y en la función anónima lo pasamos como argumento
para que pueda ser accedido y usado dentro de dicha función.
Se pueden usar tantos parámetros como sean necesarios, solo es importante que estén
encerrados entre llaves {} y los nombres pueden ser alfanuméricos pero no está permitido
usar el guión - pero sí el subrayado _. Además, es importante el orden de los parámetros que
se pasan a la función anónima, pero no los nombres que se les de. Por ejemplo:
Pruebas
Hasta el momento hemos aprendimos cómo escribir las primeras rutas de nuestra aplicación,
utilizamos el navegador para probar dichas rutas y URLs. El problema de estas pruebas en el
navegador es que no perduran en el tiempo ni pueden ejecutarse de forma rápida / automática.
Así que ahora veremos cómo se puede probar el código que desarrollemos de forma más
inteligente, utilizando el componente de pruebas automatizadas que viene incluido con
Laravel.
• El directorio Feature donde se escriben pruebas que emulan peticiones HTTP al servidor.
• El directorio Unit donde se escriben pruebas que se encargan de probar partes individuales
de la aplicación (como clases y métodos).
De lo contrario el método NO será ejecutado como una prueba, lo cual es útil porque nos
permite agregar métodos helpers dentro de nuestra clase de pruebas.
Notas
• El comando para generar nuevas pruebas es: php artisan make:test
NombreDeLaPruebaTest
• Puedes ejecutar las pruebas con vendor/bin/phpunit o crear un alias para la consola.
• Puedes leer sobre los métodos de aserciones disponibles en la documentación de Laravel.
Ejercicio
Crea una ruta, con su prueba correspondiente para editar usuarios (la URL debería tener el
formato /usuarios/{ID del usuario aquí}/edit).
Desafío adicional: La ID sólo debería aceptar enteros y deberías escribir una prueba para
comprobar que la URL /usuarios/texto/edit no es válida.
Generar un controlador
Generamos un nuevo controlador con el comando de Artisan make:controller pasándole
el nombre que queremos darle. En el ejemplo el nombre es UserController:
Métodos en el controlador
Un controlador no es más que un archivo .php con una clase que extiende de la clase
App\Http\Controllers\Controller:
Ejercicios
Mueve el código de la ruta para editar usuarios que creaste en el ejercicio de la lección pasada,
a una nueva acción edit dentro de UserController. Utiliza una prueba automatizada para
verificar que has hecho el cambio correctamente.
Desafío adicional: divide la ruta de saludo en 2 rutas diferentes que apunten a 2 acciones
diferentes, para de esta manera eliminar la necesidad de un condicional y el parámetro
opcional. Utiliza la prueba automatizada para verificar que has hecho el cambio
correctamente.
Vistas en Laravel
Laravel también nos permite separar la lógica de presentación (es decir cómo vamos a
«presentar» el contenido al usuario) de la lógica de nuestra aplicación (por ejemplo cómo
vamos a obtener el contenido de la base de datos, validar datos de la petición, etc.) a través
de la capa de «vistas».
También podemos usar el método with encadenándolo al llamado a la función view para
pasar datos a la vista en formato de array asociativo:
Nota:
Para utilizar el sistema de plantillas de Laravel debemos renombrar nuestras vistas para que
tengan la extensión .blade.php.
Ciclos y estructuras
Si queremos utilizar ciclos y estructuras condicionales, podemos utilizar directivas. Las
directivas de Blade van precedidas por un arroba (@) y luego el nombre de la directiva:
Podemos utilizar la directiva @elseif, que como su nombre sugiere nos permite utilizar un
bloque else if:
En el ejemplo anterior queremos mostrar el listado de usuarios a no ser que la lista esté vacia.
De lo contrario queremos mostrar el mensaje del bloque else.
También podemos utilizar la directiva @empty que es una forma más corta de escribir @if
(empty (...))
En este caso por supuesto invertimos los bloques dentro del condicional.
Con la directiva @forelse podemos asignar una opción por defecto a un ciclo foreach sin
utilizar bloques anidados:
Vistas en caché
Laravel compila y guarda en caché nuestras vistas, por lo que usar el motor de plantillas
Blade no afecta el rendimiento de nuestra aplicación. Puedes ver estas vistas compiladas en
el directorio /storage/framework/views.
Ejercicio
En UserController asigna y crea vistas para las otras acciones y practica pasando datos a
la vista.
Nota:
Cuando trabajas con Laravel puedes utilizar Bootstrap, Materialize, Bulma o cualquier
framework de CSS o diseño personalizado.
Directiva @include
Blade incluye una directiva llamada @include. Para usarla solamente tenemos que pasarle
el nombre del archivo que queremos incluir:
Helper asset()
El helper asset nos dará la ruta absoluta al archivo indicado:
Utilizando este helper se puede evitar que la ruta del archivo cambie dependiendo de la URL.
Utilizando la directiva @yield dentro de esta plantilla podemos indicar secciones (pasando
como argumento el nombre de la sección) y luego en plantillas individuales podemos colocar
el contenido de dichas secciones:
Nota:
Puedes nombrar tu layout de cualquier forma, siempre y cuando coloques la extensión
.blade.php. En este ejemplo se llama layout.blade.php.
Se pueden agregar tantas directivas @yield como quieras a tu layout. Por ejemplo, puedes
agregar una directiva yield para personalizar el título de la página:
Nota:
La directiva @section define una sección de contenido, mientras que la directiva @yield es
usada para mostrar el contenido de una sección específica.
Dado que el titulo es una sola línea, podemos pasar el contenido como el segundo argumento
de @section:
El código que se encuentra entre comillas es PHP y no Blade, por lo que en lugar de utilizar
la sintaxis de dobles llaves {{ $id }} utilizaremos {$id} o simplemente $id.
Las migraciones son agnósticas al motor de base de datos que tu proyecto use. Al crear un
esquema, las migraciones crearán las tablas para el motor de base de datos que tengamos
configurado, pero estas mismas migraciones las podemos usar con otros motores de bases de
datos diferentes. Es decir, podemos usar el mismo esquema en múltiples motores de bases de
datos (siempre que el motor sea soportado por Laravel).
• 2014_10_12_000000_create_users_table.php
• 2014_10_12_100000_create_password_resets_table.php
Una migración no es más que una clase de PHP que extiende de la clase Migration. El
nombre de la clase corresponde al nombre del archivo, en el caso de
2014_10_12_000000_create_users_table.php, encontramos, pero con formato «studly
case» (la primera letra de cada palabra en mayúscula, comenzando con mayúscula) en lugar
de separado por guiones:
En el método up() se especifica lo qué queremos que haga la migración. Por decirlo de
alguna forma, en qué manera queremos que «evolucione» la base de datos cuando se ejecute
dicha migración. Típicamente agregaremos tablas a la base de datos, pero también podemos
agregar columnas a una tabla ya existente, o incluso podemos generar una migración para
eliminar una tabla o columna que ya no necesitemos.
Para crear una tabla llamamos al método create del Facade Schema, pasando como primer
argumento el nombre de la tabla que queremos crear (en este caso users) y como segundo
argumento una función anónima que recibe como argumento un objeto de la clase
Blueprint. Con los métodos que nos provee este objeto diseñaremos la estructura de la tabla:
Métodos Helpers
Una de las tantas ventajas de usar el constructor de esquemas de Laravel, es que este incluye
métodos helpers que facilitan tareas comunes y evitan la necesidad de duplicar código, por
ejemplo el método: $table->timestamps(); agregará 2 columnas: created_at y
updated_at de tipo timestamp (marca de tiempo) a la tabla en cuestión. Estas columnas son
bastante típicas para almacenar el momento en que un registro fue creado o actualizado.
Notas:
En programación un Helper no es más que una función de apoyo que permite resolver tareas
genéricas / comunes.
Al hacer esto Laravel automáticamente creará nuestras tablas en la base de datos. Al ejecutar
nuestras migraciones por primera vez, Laravel creará una tabla llamada migrations donde va
a guardar la información de las migraciones que han sido ejecutadas.
Facades
Schema y Route son Facades. En Laravel los Facades son una manera de acceder a las clases
internas del framework con una interfaz estática y fácil de usar. Pero esto no quiere decir que
Laravel esté conformado sólo de clases estáticas, al contrario, Laravel utiliza muy buenas
practicas de la programación orientada a objetos como la inyección de dependencias,
Ejercicio
Crea una base de datos y configura el archivo .env para que puedas ejecutar las migraciones
con el comando php artisan migrate. Una vez que lo logres verifica que las tablas se
hayan creado con éxito utilizando cualquier administrador de bases de datos.
Comando reset
El comando de Artisan migrate:reset va a hacer un retroceso (roll back) de las migraciones
ejecutadas previamente. En este ejemplo vamos a eliminar las tablas users y password_resets.
Luego de ejecutar este comando, podemos ejecutar el comando php artisan migrate para
volver a crear las tablas.
Para que estos cambios tengan efecto debemos ejecutar el comando de Artisan
migrate:refresh.
Modificar migraciones
Al realizar una modificación en la migración original tenemos el problema de que los
comandos reset y refresh eliminaran el contenido de las tablas en la base de datos. Para
evitar esto podemos (utilizando el comando make:migration) crear una nueva migración y
agregar desde ahí las modificaciones que necesitamos:
Nota importante:
Es una buena practica que el nombre de la migración sea descriptivo y haga referencia a lo
que vamos a hacer. En este caso add_profession_to_users indica que queremos agregar
el campo profession a la tabla users.
Dentro del método up() de la migración en lugar de usar el método create del facade
Schema utilizaremos table y pasaremos como primer argumento el nombre de la tabla que
queremos modificar:
En el método down() especificamos la acción inversa, en este caso eliminar la columna que
agregamos en el método up():
En este caso indicamos que queremos agregar la columna profession después del campo
password.
Comando rollback
Utilizando el camando de Artisan migrate:rollback Laravel regresará el último lote de
migraciones ejecutado:
También podemos pasar la opción --create en caso de que no queramos usar la convención:
Aquí es importante que el tipo del campo profession_id coincida con el campo id en la tabla
professions. Es decir el campo profession_id debe ser definido como un entero positivo, para
ello usamos el método:
$table->unsignedInteger('nombre_del_campo_aqui'); o
$table->integer('nombre_del_campo')->unsigned();
Claves primarias
Cuando diseñamos una base de datos, suele ser importante tener un campo (o combinación
de campos) que pueda identificar de manera única a cada fila. Así como tienes un número de
pasaporte que es único, cada usuario o profesión va a tener un identificador (id) único. En
esta base de datos usaremos identificadores de tipo auto-incremento, es decir la primera fila
obtendrá el identificador 1, la segunda 2, y así sucesivamente. Estos identificadores serán
generados por el motor de la base de datos.
Nota importante:
Ten en cuenta que ejecutar php artisan migrate:fresh va a eliminar todas las tablas.
Hazlo solamente si no te importa perder los datos (porque solo son de prueba, etc).
Generar un seeder
Para generar un seeder utilizamos el comando de Artisan make:seeder seguido del nombre
del seeder:
Nota:
Para utilizar el facade DB:: debemos importar \Illuminate\Support\Facades\DB al
principio del archivo:
Registrar seeder
Los seeders son registrados en la clase DatabaseSeeder dentro de
database/seeds/DatabaseSeeder.php. Dentro del método run llamamos al método call
pasando como argumento el nombre de la clase de nuestro seeder:
Eliminar registros
Es posible que antes de ejecutar un seeder necesitemos eliminar el contenido existente. Para
realizar esto podemos utilizar el método truncate, que se encarga de vaciar la table:
Ejecutar un seeder
Para ejecutar los seeders utilizamos el comando db:seed desde la terminal:
En caso de que tengas múltiples seeders, puedes pasar la opción --class que te permite
ejecutar solamente el seeder pasado como argumento:
Utilizando la misma sentencia pero con el valor 1 reactivamos la revisión de claves foráneas
luego de ejecutar nuestro seeder.
Ahora podrás llamar al método truncateTables pasando un arreglo con los nombres de las
tablas que quieras vaciar.
Método insert
Con el método DB::insert podemos escribir consultas SQL de forma manual para insertar
contenido dentro de nuestra base de datos. Por ejemplo, el código del seeder
ProfessionSeeder.php que utiliza el método DB::table:
Nota
Aunque DB::insert nos da el mismo resultado que DB::table, cuando realizamos
consultas de este tipo y recibimos datos ingresados por un usuario debemos tener mucho
cuidado, ya que nos exponemos a ataques de inyección de SQL.
Inyección de SQL
Nuestro código es vulnerable a inyecciones de SQL cuando insertamos variables dentro de
una solicitud de SQL. Por ejemplo, si se tuviera una consulta donde se selecciona una serie
de articulos dependiendo de un autor:
Esta consulta trae todos los artículos escritos por un determinado autor. Sin embargo, dentro
de esta consulta estamos insertando contenido de forma directa al colocar la variable $id.
Hay que suponer que si ingresamos a los artículos del autor desde una URL, pasando como
argumento el id del autor (?id=1 o articulos/{id}), en este caso retornaríamos todos
los artículos escritos por el autor cuyo id sea igual a 1. Sin embargo, como el código es
vulnerable, un usuario malintencionado podría cambiar la URL por ?id=1 UNION SELECT
password FROM users. La consulta realmente se estaría realizando de esta forma:
Nota:
Al almacenar contraseñas en una base de datos asegurate de siempre encriptarlas.
Parametros dinámicos
Para evitar ataques de inyección de SQL podemos utilizar parámetros dinámicos. Laravel
utiliza internamente el componente PDO de PHP y debido a esto podemos colocar
marcadores en nuestra consulta. Laravel nos permite pasar sus valores en un array como
segundo argumento del método:
Otra forma de pasar los parametros es usando como marcador un parámetro de sustitución
con nombre y como segundo argumento pasamos un array asociativo de los respectivos
parámetros con sus valores:
Al hacer esto estaremos protegidos de ataques de inyección de SQL puesto que los
parámetros dinámicos serán escapados de forma automática y segura.
Por otro lado, utilizando el constructor de consultas podemos realizar una consulta SQL de
tipo SELECT, de la siguiente forma:
El operador = dentro del método where es opcional. Pasando el nombre de la columna junto
con el valor, Laravel asumirá que quieres usar el operador de comparación de igualdad (=):
Métodos dinámicos
También podemos utilizar métodos dinámicos:
Ejercicios
• Para esta lección inserta un usuario usando SQL de forma manual con DB::insert.
• Mueve la columna profession_id para que esté luego de la columna id.
• Utilizando el método DB::delete elimina una profesión.
Por defecto modelos serán generados en el directorio app de nuestra aplicación, con su
nombre más la extensión .php. En nuestra caso Profession.php o
ProfessionCategory.php. También podemos generar el modelo dentro de otro directorio,
especificando el nombre del directorio antes del modelo:
En caso de que el nombre de la tabla no sea igual al nombre del modelo, debemos
especificarlo en el modelo definiendo la propiedad $table:
Importando el modelo al principio del archivo, evitamos tener que hacer referencia a
\App\Profession cada vez que trabajemos con el modelo:
Realizar consultas
Podemos utilizar los modelos para hacer consultas a la base de datos. Utilizando el método
all() obtenemos todo el contenido de la tabla:
También podemos encadenar métodos del constructor de consultas para obtener resultados
más específicos:
Acceder a Tinker
Podemos acceder al entorno con el comando de Artisan tinker:
Desde el entorno interactivo podemos ejecutar expresiones de PHP y también vamos a tener
disponible las clases de nuestro proyecto y del framework.
Estos métodos de la clase Collection no generan nuevas consultas SQL sino que operan sobre
los resultados ya encontrados.
Nota:
Las colecciones de Eloquent extienden de la colección base pero proveen algunos métodos
extra asociados al ORM.
En este caso isAdmin() devuelve true si el email del usuario es igual al valor con el que está
siendo comparado:
Para evitar esto, dentro del modelo agregamos la propiedad $fillable y asignamos como
valor un array con las columnas que queremos permitir que puedan ser cargadas de forma
masiva:
Nota que new User($datos) solo crea un nuevo modelo sin persistirlo en la base de datos
VS User::create($datos) que crea un nuevo modelo y lo inserta en la base de datos en
un solo paso.
Convertir atributos
La propiedad $casts nos permite convertir atributos a diferentes tipos de datos dentro de un
modelo. $casts recibe como valor un array donde la llave es el nombre del atributo que será
convertido y el valor el tipo al que lo queremos convertir:
Relaciones «Pertenece a»
El método belongsTo nos permite trabajar con relaciones donde un registro pertenece a otro
registro. Este método acepta como primer argumento el nombre de la clase que queremos
vincular. Eloquent determina el nombre de la llave foránea a partir del nombre del método
(en este caso profession) y agregando el sufijo _id a este:
Si en la base de datos el nombre de la llave foránea no sigue esta convención puedes pasar el
nombre de la columna como segundo argumento:
En este caso Eloquent buscará la relación entre la columna profession_name del modelo
Users y la columna name del modelo Profession.
Hecho esto, utilizando cualquiera de las formas anteriores, podemos obtener la profesión del
usuario:
Los métodos que nos permiten relacionar un modelo con muchos otros siempre van a retornar
una colección, así esté vacía y los métodos que nos permiten relacionar un modelo con otro
van a retornar el modelo o null.
Construir consultas
Podemos construir una consulta llamando al método de una relación. Por ejemplo,
encadenando el método where() a users() podemos obtener todos los usuarios asociados a
una profesión pero que tengan la columna is_admin como true:
Dentro de nuestro Model Factory especificamos el atributo o los atributos que queremos
generar de forma aleatoria:
Además es importante que indiquemos el nombre del modelo que queremos enlazar a dicho
Model Factory (en este caso \App\Profession::class).
Utilizando el componente de PHP Faker indicamos que el valor de title será una oración
aleatoria:
O un texto aleatorio:
Cada vez que ejecutamos el método create() creamos un nuevo registro aleatorio. Si
pasamos un array asociativo al método create() podemos sobrescribir o asignar
propiedades extras:
Se recomienda ver y repasar los temas donde se explica cómo crear rutas, controladores,
vistas y además cómo crear y trabajar con bases de datos en Laravel.
La variable $user dentro del ciclo @forelse ya no contiene una cadena de texto sino un
objeto. No podemos imprimir estos objetos como si se trataran de una cadena, pero sí
podemos imprimir las propiedades de cada objeto:
Podemos tener dos bases de datos, una para interactuar con nuestra aplicación en el
navegador y otra para las pruebas que vayamos a ejecutar. De esta forma la ejecución de las
pruebas automatizadas no afectará nuestra interacción con la aplicación en local y viceversa.
El método find() también acepta un array de claves primarias. Pasando este array, find()
devolverá una colección con los registros encontrados:
Actividades
Mejora el diseño del perfil utilizando Bootstrap o CSS y presume de ella compartiendo una
captura en los comentarios.
Al llamar al helper url() sin pasar ningún argumento, Laravel retornará una instancia del
objeto Illuminate\Routing\UrlGenerator, con el que podemos tener acceso a diferentes
métodos. Por ejemplo, el método previous() que nos devuelve la URL anterior:
Otros métodos disponibles son current() y full() con los que podemos tener acceso a la
URL actual y la URL actual con la cadena de consulta (Query String):
También podemos utilizar el alias y facade URL para acceder a estos métodos:
Si estás pasando como argumento una llave primaria de un modelo de Eloquent, puedes pasar
el modelo directamente a route(). El helper extraerá automáticamente dicha llave primaria:
Actividades
Recuerda mejorar el diseño de las pantallas que hemos creado hasta ahora, agregar más
detalles para cada usuario y compartir tus capturas.
Para que esto funcione, nota que el nombre del parámetro en la declaración de la ruta debe
coincidir con el nombre del parámetro en la declaración del método:
Además el tipo del parámetro debe ser, por supuesto, un modelo de Eloquent (en nuestro
ejemplo es App\User).
Podemos tener dos rutas que utilicen la misma URL pero con diferentes métodos:
Token (CSRF)
El middleware VerifyCsrfToken nos permite evitar que terceros puedan enviar peticiones
de tipo POST a nuestra aplicación y realizar ataques de tipo cross-site request forgery. Para
agregar un campo con el token dentro de nuestro formulario, que le va a permitir a Laravel
reconocer peticiones de formulario que sean válidas, debemos llamar al método
csrf_field():
El método csrf_field() agregará un campo oculto llamado _token con el valor del token
al código HTML del formulario.
Al método assertRedirect() podemos pasar como argumento el helper route para utilizar
el nombre de una ruta en lugar de una URL:
Para comprobar que se ha creado un usuario con los datos que hemos pasado en la petición
POST, utilizaremos el método assertDatabaseHas. Como primer argumento pasamos el
nombre de la tabla y como segundo argumento los datos que esperamos encontrar:
En este caso esperamos encontrar dentro de la tabla users, un registro con un campo name
igual a Salvador y un campo email igual a duarte@mail.com.
Para recibir los datos de la petición dentro del controlador podemos utilizar el método
request():
Nota:
Recuerda agregar el llamado a la función csrf_field() dentro de tu formulario para generar
el campo oculto que contiene el token para pasar la protección contra ataques de tipo CSRF
que provee Laravel por defecto.
Es importante que los valores de los atributos name de los campos en el formulario HTML
coincidan con los atributos que estás obteniendo del objeto Request dentro del controlador
de Laravel:
Actividades
Usa el código de Bootstrap (o cualquier otro framework de CSS de tu preferencia) para
mejorar los estilos del formulario.
Dentro de la prueba comprobamos que la sesión contiene un error para el campo name
utilizando assertSessionHasErrors:
En este caso el número de usuarios en la base de datos retornado por User::count() debería
ser cero ya que dentro de la prueba estamos utilizando el trait RefreshDatabase.
Pasando otro array como segundo argumento podemos especificar los mensajes de los
errores. Al nombre del campo debemos anexar el nombre de la regla de validación (en este
caso required y nota que «name» y «required» están separados por un punto):
En lugar de separar las reglas con una barra vertical, podemos pasar un array donde cada
valor será el nombre de una regla diferente:
Nota como los parámetros se especifican con : seguido de cada parámetro separado por
comas.
Ejercicio
Agrega una regla de validación para comprobar que el campo password contenga más de 6
caracteres.
Con assertViewHas podemos comprobar que la vista contiene la variable pasada como
argumento:
En este caso old() intentará cargar los datos referentes al campo name que se encuentren en
la sesión y si no los consigue cargará el valor de $user->name.
Actividad
Acomodar y agregar más estilos al formulario y a los mensajes de error.
Recuerden que se deben encriptar la contraseña utilizando bcrypt antes de pasar los datos al
método update():
Recuerden que debemos colocar el método from() con la URL del formulario antes del
método put() para poder probar que la redirección se ha efectuado correctamente:
Recuerden que pueden traducir los mensajes de error pasando un array asociativo como
segundo argumento al método validate():
Validar que el e-mail sea único cuando se edita un usuario con Laravel
Ahora aprenderemos cómo pueden anexar la regla de validación para que el campo del correo
electrónico del usuario pueda ser único de forma correcta en la acción para editar usuarios.
Si la tabla no utiliza una columna llamada id como clave primaria, necesitas especificar el
nombre de la columna al llamar al método ignore, por ejemplo:
Nota:
Si tratamos de acceder a una URL que existe pero utilizando un método diferente recibiremos
una excepción de tipo MethodNotAllowed.
También podemos utilizar assertSame, pasamos como primer argumento el valor esperado
y como segundo argumento la cantidad de usuarios actual:
Si estamos cargando el modelo con Route Model Binding podemos llamar al método
delete para eliminar el registro directamente:
Recuerda que en lugar de escribir la URL puedes usar el nombre de la ruta para redirigir:
Notas:
• Para utilizar Laravel no es obligatorio usar Bootstrap. Puedes usar tus propios estilos
personalizados o cualquier otro framework de CSS como Materialize o Foundation.
• Puedes encontrar los enlaces al CDN de Bootstrap en la documentación oficial.
Actividad
Mejora los estilos del formulario para editar y de la página de detalle del usuario.