Laravel 9.*
Laravel se ha convertido en el framework php más utilizado para desarrollo web.
En septiembre/2019 se publicón la versión 6.0
Desde entonces usa versionado semántico.
Febrero y agosto: versiones mayores: 6 (LTS), 7, ... (febrero 2022: v9)
Semanalmente pueden aparecer versiones menores (segundo dígito) y de parcheo (tercero).
Las versiones mayores pueden incluír cambios de ruptura, el resto no.
Usa arquitectura MVC (Modelo Vista Controlador) y mucho más:
Sistema de enrutamiento potente
Usa Blade como gestor de plantillas
Su propio ORM: Eloquent (¿Adios SQL en nuestros proyectos?, para el 99% de las situaciones, sí)
Y muchos otros componentes que lo hacen muy interesante: Query Builder, Database Migrations, Seeders, Passport, Dusk, Socialite, ... y muchos otros componentes brindados por terceras partes.
Enlaces:
Wikipedia mejor en inglés.
Laracast: videotutoriales oficiales
Styde.net: numerosos videotutoriales, cursos y publicaciones
Código fuente. Se puede clonar para iniciar proyecto.
Instalación
https://laravel.com/docs/9.x/installation
Requisitos: https://laravel.com/docs/9.x/deployment
php8.0 y algunos complementos
Composer (v2) como gestor de dependencias
Podemos desarrollar sin servidor o con él (Apache o Nginx)
Podemos dockerizar el entorno de desarrollo. Usando docker podríamos obviar estas dependencias en el anfitrión pero las vamos a instalar. Facilitará nuestra tarea.
Instalación via composer (directorio laravelpruebas):
Esto implica:
Descargar fremwork original
Ejecutra composer install
Crear fichero de entorno (.env)
Generar clave de cifrado
Instalación via git
Partimos del código de GitHub o de otro proyecto Laravel. Vamos a usar este ejemplo para iniciar el proyecto en nuestro entornods. Aquí todas las fases son manuales:
Antes de nada, vamos a la rama correcta de "entornods"
Descarga
Instalación de dependencias. Ojo, si no tenemos la versión correcta de php y composer entramos dentro del contenedor.
Crear fichero de entorno a partir del de ejemplo:
Creación de la clave de cifrado (ver .env).
NOTA
artisan se usa de forma generalizada. Por ejemplo, todas las clases deben crearse con ese comando.
Podemos desarrollar sin servidor ejecutando:
Laravel en nuestro entornods:
Descargamos nuestro entornods y nos ponemos en la rama laravel
Añadimos al fichero hosts:
Colocamos el directorio del proyecto dentro de data
Levantamos nuestro servicio:
OJO!!!
El entornods viene configurado para una aplicación ubicada en data/laravel (o data/laravel9)
El resto de instrucciones también
Si usamos otro nombre deberemos ajustar alguno de estos comados y el contenido del fichero docker-compose.yml
El uso de la consola va a ser importante en el desarrollo con Laravel
Puede ser interesante definir aliases de comandos
Editamos el fichero ~/.bashrc
ejecutar lo siguiente si no queremos reiniciar:
El fichero
.env
El fichero .env define variables utilizadas únicamente en el entorno de desarrollo.
Cada sitio de desarrollo o producción mantiene su propio
.env
Este fichero debe excluirse de git. Compruébalo en el fichero .gitignore.
Debemos ajustar la parte de BBDD y el APP_URL=http://laravel.local
El directorio de configuración es config. Buena parte de la configuración es condicionada al contenido del fichero
.env
Repositorio de clase
Vamos a usar el repositorio: laravel20
Recomendación: hacer un fork del mismo:
Una vez hecho esto:
Ve a bitbucket y realiza un fork
Clona dentro de
entornods/data
tu repositorioInstala dependencias
Obten una copia del fichero
.env
Genera la clave de cifrado
Es interesante poder descargar el código de clase. Para hacerlo añade el repositorio del profesor:
Cuando quieras descargar la última clase:
Arquitectura
Configuramos nuestro servidor para que todas las peticiones lleguen a index.php (var https://laravel.com/docs/6.x/installation)
index.php sólo crea un objeto $app a partir del script bootstrap/app.php.
Tras esto la petición o request se pasa al kernel (nucleo) http o de consola:
Kernel Http:
Carga clases bootstrapers que preparan la aplicación (heredado)
Define una serie de middlewares (filtros) que se ejecutan antes de tratar el request, es decir, antes de ejecutar un método del controlador correspondiente.
Por fin, el kernel trata el request y devuelve un response (heredado)
Todas las clases dentro de Iluminate están dentro de vendor, son parte del framework y no debemos modificarlas en absoluto. Todo lo "heredado" está ahí.
La respuesta
Tras preparar la aplicación, la petición se pasa al router
De acuerdo a las rutas definidas se genera una respuesta o se delega en un controlador.
A las rutas y controladores se les puede asignar middlewares.
Los Service Providers
Son el elemento clave en el arrange (bootstraping) de la aplicación.
Definen los componentes disponibles en la aplicación.
El fichero
config/app.php
cuenta con un array donde definimos cuales otros queremos usarMuchos de ellos están en el frameword (empiezan por Illuminate)
Otros están en app/Providers
Si añadimos librerías o creamos los nuestros propios (avanzado) deberemos añadir elementos a este array.
Rutas
https://laravel.com/docs/9.x/routing
En nuestro framework mvc "casero", un controlador era responsable de una tarea concreta, o conjunto de tareas relacionadas entre sí (CRUD sobre una tabla, por ejemplo).
Para nosotros el path o ruta de nuestra url representaba /controlador/metodo/arg1/arg2/argN.
Laravel tiene un sistema de enrutado mucho más flexible y potente.
Las rutas se definien en el directorio
routes
:web.php
define todas las rutas de la aplicación webapi.php
define las rutas asociadas a un servicio webconsole.php
define rutas usadas desde la consola conphp artisan
channels.php
se usa en aplicaciones en tiempo real y websockets. No toca...
Para definir una ruta usamos una clase llamada Route.
Usamos una función que define el tipo de petición (get, post, ...)
Definimos una ruta
Definimos una función de callback o como veremos un controlador y un método
Veamos algunos ejemplos ilustrativos:
Rutas y controladores
Las rutas anónimas son útiles para pequeñas tareas y pruebas.
Pero un trabajo serio necesita el uso de controladores (MVC)
Ojo! Esto cambió en la versión 8. Anteriormente la sintáxis era:
Rutas resource: REST
Un CRUD necesita definir 7 rutas para 7 acciones.
Lectura: ruta de listado y de detalle
Creación: mostrar formulario de alta y procesarlo
Update: mostrar formulario de edición y procesarlo
Borrado
Si definimos rutas de tipo resource se mapearán estas 7 rutas.
En la medida de lo posible estas rutas siguen el paradigma REST.
Son las acciones necesarias para un CRUD completo y usando los distintos verbos HTTP: get, post, put y delete.
Para ver como gestionar estas rutas y este tipo de controladores: https://laravel.com/docs/9.x/controllers#resource-controllers
Definición de una ruta
Creación de un controlador resource:
Lista de rutas:
GET
/photos
index
photos.index
GET
/photos/create
create
photos.create
POST
/photos
store
photos.store
GET
/photos/{photo}
show
photos.show
GET
/photos/{photo}/edit
edit
photos.edit
PUT/PATCH
/photos/{photo}
update
photos.update
DELETE
/photos/{photo}
destroy
photos.destroy
MVC: Controladores & vistas
Laravel es mucho más que una arquitectura MVC
No obstante esta es una parte fundamental del framework
Veamos de momento como tratar controladores y vistas
Controladores
Su ubican en app/Http/Controllers
Para crear un controlador usaremos:
Si queremos usar rutas de tipo resource:
Si en un método necesitamos hacer uso del objeto $request debemos incluírlo en su cabecera con type hinting:
Podemos acceder a los parámetros GET y POST así:
Vistas: Blade
Las vistas en php: php + html ==> código poco claro.
Mejor motores de plantillas que facilitan la inclusión de contenido variable en nuestro html.
Motores de plantillas son:
Blade, usado por Laravel
Smarty, muy habitual, no ceñido a ningún framework
Twig, usado por Simphony.
Código más limpio.
En laravel se devuelven con la función helper view()
Desde un controlador o ruta:
Buscará una vista en el directorio resources/views/grupo
El fichero se llamará vista.blade.php o vista.php
Para llevar variables a la vista debemos hacer lo siguiente:
Ejemplos:
Existen otras variantes:
Con with:
Y por último usando compact.
Modelos y Bases de datos.
Un modelo se crea así:
Pero para hablar de modelos debemos entender como gestionar las BBDD.
Para hacerlo Laravel nos brinda:
Migraciones
Seeders
Model Factrories
Migraciones
Laravel provee un sistema llamado "migraciones" que permite elaborar la estructura de la base de datos de un modo paulatino.
Las migraciones se asemejan a un control de versiones para la base de datos. Cada migración puede desplegarse o deshacerse según se precise.
Facilitan enormemente el trabajo en equipo y mediante SCV (git u otro).
Facilitan la migración de SGBD (Mysql, PostGres, ...).
Facilitan la implantación en nuevos equipos de desarrollo o en producción.
Debemos crear una migración por cada tabla.
Debemos crearla con artisan y editarla después.
Nota, en la versión 6 podemos crearla a la vez que el modelo:
Para modificar una tabla tenemos dos opciones:
Modificar la migración de creación. NO SIEMPRE POSIBLE
Crear una migración de modificación. Ejemplo:
Creación de migraciones
Se usa
artisan make:migration
:El resultado es una clase hija guardada database/migrations
El fichero se nombra usando el timestamp de creación para que sea ejecutado en el orden correcto.
Métodos de una migración
up() sirve para modificar la base de datos. Típicamente crear una tabla.
down() sirve para devolver la base de datos a su estado previo. Típicamente borrar una tabla.
Código de las migraciones
Dentro de las funciones up y down usamos las funciones de la clase esquema para:
Crear tablas:
Modificar tablas.:
Borrar tablas:
En las funciones anónimas (closure) de creación y modificación podemos hacer prácticamente cualquier cosa que soporte SQL. Debemos usar los métodos de la clase Blueprint aplicados a la variable $table:
Los posibles modificadores son:
Para otras operaciones consultar la documentación oficial.
Seeders (o sembradores)
Los seeders son clases usadas para:
Rellenar las tablas con datos de prueba
Cargar las tablas con datos iniciales.
Creación con artisan:
php artisan make:seeder StudySeeder
Los seeders tienen un método run() donde se registra el contenido de los registros a insertar. Puede usarse sintáxis de Query Builder o de Eloquent
Ejemplo:
El orden en que se ejecutan los seeders se establece manualmente. Debe rellenarse el método run() de la clase DatabaseSeeder ubicada en database/seeds
Su ejecución es desde artisan:
Modo general
php artisan db:seed
Junto a las migraciones:
php artisan migrate:refresh --seed
De forma individual
php artisan db:seed --class=ModuleSeeder
Model Factories
Un factory es una clase usada principalmente para desarrollo
Permite llenar nuestra base de datos con registros de prueba
Crear un factory:
Codificar un factory:
Usar el factory:
Crear un objeto con
make()
o concreate()
, el primero crea una variable, el segundo además la guarda en base de datos:
Podemos crear más de un registro en la misma orden:
Además podemos fijar o sobreescribir el valor de los campos:
Modelo
Bases de datos
Para acceder a bases de datos podemos (por orden):
ORM: Eloquent. Usado por Laravel y que usa una arquitectura Active Record.
Fluent Query Builder. Un sistema de creación de consultas independiente del gestor de bbdd utilizado.
SQL. Usar consultas de Raw Sql (sql en crudo o a pelo). Poco habitual
Bases de datos compatibles:
MySQL
Postgres
SQLite
SQL Server
https://laravel.com/docs/6.x/database
Configuración:
Fichero config/database.php.
Pero basada en el .env.
Podemos usar las bases de datos de forma convencional, creadas previamente.
Más interesante usar migraciones como veremos.
Modelo
Las clases modelo extienden una superclase llamada Model
Heredan métodos muy interesantes.
Permiten realizar multitud de operaciones sin escribir una sóla línea de código a través de Eloquent.
Nomenclatura:
El nombre del modelo: tiene que ser en singular y mayúscula. P.ej. "User"
La la tabla asociada estará en plural y minúscula. P. ej. "users"
Clave primaria por defecho "id".
Eloquent usa las columnas created_at y updated_at para actualizar automáticamente esos valores de tiempo.
Artisan nos ayuda a crear los modelos:
La migración es un fichero que nos permite ir creando a la BBDD a nuestra medida
Método up: crea o modifica una tabla
Método down: retrocede los cambios o borra la tabla
Si queremos cambiar los parámetros por defecto respecto a nombre de tabla, clave primaria y uso de columnas temporales:
Veamos un ejemplo de CRUD Study. Vamos a ver el código de las clases Study y de StudyController.
Clase modelo. Muy sencillo porque Eloquent nos provee de los métodos que necesitamos.
Clase modelo. Usamos los métodos que nos facilita Eloquent como son:
El controlador:
Response
Podemos reenviar la respuesta de diferentes modos:
Reenvio a una ruta concreta:
Reenvío a rutas con nombre o con URL:
Reenvío a la misma ruta de la que venimos, e incluso añadir mensajes de error:
Reenviar a un método de un controlador:
Migraciones y Seeders
Migraciones
Laravel provee un sistema llamado "migraciones" que permite elaborar la estructura de la base de datos de un modo paulatino.
Las migraciones se asemejan a un control de versiones para la base de datos. Cada migración puede desplegarse o deshacerse según se precise.
Facilitan enormemente el trabajo en equipo y mediante SCV (git u otro).
Facilitan la migración de SGBD.
Facilitan la implantación en nuevos equipos de desarrollo o en producción.
Debemos crear una migración por cada tabla.
Debemos crearla con artisan y editarla después.
Nota, en la versión 6 podemos crearla a la vez que el modelo:
Ejemplo de migración de la tabla studies:
Para modificar una tabla tenemos dos opciones:
Modificar la migración de creación. NO SIEMPRE POSIBLE
Crear una migración de modificación. Ejemplo:
Ejecutar migraciones
El resultado es una clase hija guardada database/migrations
El fichero se nombra usando el timestamp de creación para que sea ejecutado en el orden correcto.
Métodos de una migración
up() sirve para modificar la base de datos. Típicamente crear una tabla.
down() sirve para devolver la base de datos a su estado previo. Típicamente borrar una tabla.
Código de las migraciones
Dentro de las funciones up y down usamos las funciones de la clase esquema para:
Crear tablas:
Schema::create('nommbreTabla', 'funcion_closure');
Renombrar tablas:
Schema::rename\($original, $nuevo\);
Borrar tablas:
Schema::drop('users');
oSchema::dropIfExists('users');
Modificación de tablas:
Schema::table('nommbreTabla', 'funcion_closure');
En las funciones anónimas (closure) de creación y modificación podemos hacer prácticamente cualquier cosa que soporte SQL. Debemos usar los métodos de la clase Blueprint aplicados a la variable $table:
Los posibles modificadores son:
Para otras operaciones consultar la documentación oficial.
Seeders (o sembradores)
Los seeders son clases usadas para:
Rellenar las tablas con datos de prueba
Cargar las tablas con datos iniciales.
Creación con artisan:
php artisan make:seeder StudySeeder
Los seeders tienen un método run() donde se registra el contenido de los registros a insertar. Puede usarse sintáxis de Query Builder o de Eloquent
Ejemplo:
El orden en que se ejecutan los seeders se establece manualmente. Debe rellenarse el método run() de la clase DatabaseSeeder ubicada en database/seeds
Su ejecución es desde artisan:
Modo general
php artisan db:seed
Junto a las migraciones:
php artisan migrate:refresh --seed
De forma individual
php artisan db:seed --class=ModuleSeeder
Model Factories
Crear un factory:
Codificar un factory:
Usar el factory:
Crear un objeto con
make()
o concreate()
, el primero crea una variable, el segundo además la guarda en base de datos:
Podemos crear más de un registro en la misma orden:
Además podemos fijar o sobreescribir el valor de los campos:
Relaciones entre tablas/modelos
El ORM Eloquent no pone fácil para tratar las relaciones entre tablas.
Basta añadir algunos métodos a los modelos implicados.
Vamos a ver únicamente las relaciones 1:N
Para relaciones 1:1 y N:M ver la documentación
Vamos a verlo con el ejemplo entre usuarios y roles: un
Role
puede tener variosUsers
y unUser
pertenece a unRole
.Crear modelo Role (y migración, seeder y controlador)
-m
añade la migración-s
añade el seeder-cr
añade el controlador (c) tipo resource (r)
Métodos de la migración
Modificación de la tabla users.
Es habitual tener que modificar tablas que ya existen. Para eso usamos migraciones un poco diferentes:
Creamos o modificamos el RoleSeeder y el UserSeeder:
No debemos olvidar actualizar el DatabaseSeeder:
Por fín los modelos: Vamos a tratar una relación 1:N
Un
Role
tiene muchosUsers
asociados.La clase Role debe incluír el siguiente método:
Un
User
pertenece a unRole
.La clase Role debe incluír el siguiente método:
Ahora podemos usarla en nuestras vistas.
Por ejemplo en "user/index.blade.php"
O en "role/show.blade.php"
Middleware
Los middleware son filtros que se ejecutan antes de que el control pase a una ruta o a un controlador.
Podemos asciar un middleware a una ruta:
O a un controlador, en su constructor:
kernel.php
En el kernel.php de la aplicación se definen varias cuestiones relativas a los middleware.
Un grupo de middleware que se aplican a todas las peticiones. Atributo $middleware.
Se asignan nombres a los middleware para ser usados en las rutas. Atributo
$routeMiddleware
.Dos grupos de middleware:
web que se aplica a todas las rutas definidas en el fichero de rutas web.php
api que se aplica a las rutas del fichero api.php
Ejemplos de middleware
CheckForMaintenanceMode Se aplica a todas las rutas. Se activa su funcionalidad con los comandos:
Después de down genera un error 503
Comprueba la existencia del fichero /storage/framework/down
Down crea el fichero, up lo borra.
Vamos a ver los que se aplican a todas las peticiones web.
EncryptCookies. Encripta las cookies
AddQueuedCookiesToResponse. Añade las cookies creadas mediante el método
Cookie::queue($micookie)
;StartSession. Inicia sesión de forma automática.
ShareErrorsFromSession Hace visible el objeto errors tras la validación.
VerifyCsrfToken. Verifica los token CSRF.
SubstituteBindings ¿?
Además, dispondemos de los siguientes definidos en route:
auth. Pasa el filtro si estás autenticado.
guest. Pasa el filtro si no has hecho login
can. Filtro usado para autorización.
throttle. Limita el número de peticiones por minuto aceptadas desde un host determinado.
Construir un middleware:
Usamos artisasn:
Código.
La lógica está en la función handle.
Si se dan las condiciones adecuadas se pasa el filtro (
return $next($request);
)Si no se dan las condiciones abortar o redirigir.
Registrar el middleware en el kernel dentro de $routeMiddleware
Ya podemos usarlo como el resto:
Sesiones y Autenticación
Autenticación
Ya vimos como añadir el sistema de autenticación propio de Laravel
Disponde de un juego de migraciones, rutas, controladores y vistas que hacen posible la gesión de usuarios
Documentación oficial: https://laravel.com/docs/7.x/frontend#introduction
Autenticarse es identificarse, que la apliación nos reconozca como un usuario concreto.
Para hacerlo debemos hacer uso de variables de sesión.
Laravel viene con un sistema base muy completo. Vamos a usar la versión usada en Laravel 7:
Las vistas generadas están construidas con Twiter Bootstrap y se almacenan en el directorio: resources/views/auth.
Rutas:
Para login se usa
/login
Tras el login se usa
/home
. Puede personalizarse en el LoginController.Por defecto el nombre de usuario es su e-mail.
Para cerrar la sesión:
logout
Para resetear la contraseña:
password/reset
Para el reseteo de contraseñas se envia un correo con un token.
Para pasar los mails a log y no enviar realmente:
En el fichero
.env
cambiar el parámetro: `MAIL_DRIVER=log `Completar en config/mail.php:
Los correos se guardan en storage/logs
Podemos ver el correo enviado para resetear contraseña
Si queremos acceder a la información del usuario actual debemos usar la clase fachada Auth.
Sesiones
Los parámetros de configuración de sesiones se definen en
config/session.php
.Importante es el almacenamiento y el tiempo de vida de la sesión.
Con Laravel no es preciso usar directamente la variable $_SESSION.
ni debemos usar las funciones session_start() o session_destroy()
Podemos acceder a un dato guardado en sesión de tres modos:
El request, esto requiere inyección de dependencias:
La fachada Session
La función helper session():
Obtener todos los datos de una sesión
Podemos guardar datos en sesión de dos modos:
Podemos eliminar datos de sesión:
Guardar datos sólo durante una petición (request) sólamente.
Esto se usa en validaciones de forma automática, transparente al usuario
Para los datos antiguos (old)
Para los mensajes de error
Query Builder. Paginación
Laravel nos permite realizar gran cantidad de consultas sin escribir sql.
Hasta el momento, sobre los modelos hemos usado algunos métodos: find(), all(), save(), first().
Las consultas pueden construirse a través de los modelos (User, Role, ...) o de la clase DB:
Vamos a poder filtrar usando
where
en alguna de sus variantes.El método
all()
no admite filtrado con where.Debemos usar
get()
Existen otras variantes que podemos consultar en la documentación:
orWhere()
whereBetween()
whereIn()....
No vamos a ver su uso. Queda como investigación del alumno.
Para paginar basta con cambiar
get()
porpaginate
En la vista la generación del índice de páginas es automático.
En la rama del proyecto de clase "clase07" ha sido necesario depurar el código
Puedes ver las explicaciones en los vídeos de dicha rama.
Validación
La validación es una cuestión fundamental en cualquier aplicación, no sólo web. Cualquiera.
Validar consiste en verificar la validez de los datos antes de procesarlos.
¿Validar en cliente o en servidor?.
En el cliente es más rápido, no necesitamos conectar con el servidor ni hacer uso de la red.
Pero nunca debemos confiar en la validación realizada en el cliente. Puede ser burlada intencionadamente o anulada de forma involuntaria.
Validar en el cliente es opcional pero en el servidor es obligatorio.
Cómo validar en Laravel
Existen varias maneras de hacerlo.
Nosotros usaremos el método validate del objeto $request.
Ejemplo:
¿¿Qué pasa tras la validación ??
Si la validación falla se produce una excepción y se reenvía la petición a la URL previa.
Se crea un objeto $errors que permite mostrar los errores de validación.
Los datos del formulario se flashean a la sesión y estarán disponibles sólo en la próxima peticicón para ser volver a rellenar el formulario como estaba.
OJO. Si usamos Ajax se envía una respuesta al cliente con un código 422 y un JSON con los mensajes de error.
Rellenando con los datos viejos
La funcion helper old() nos permite acceder a los datos que no se han validado y están en la sesión.
Mostrando los errores con blade
Todos los errores de la página
Mostrar los errores de un campo:
También podemos usar la directiva @error de blade:
Traduciendo mensajes
Podemos traducir todos los literales de Laravel. No sólo los de validación.
Debemos acceder a la siguiente ruta
Descargar la carpeta del idioma que nos interese.
Configurar el lenguaje en config.php
Reglas
Se pueden añadir múltiples reglas para cada campo. Entre comillas y separadas por la barra vertical.
La regla bail hace que no se sigan evaluando más reglas si esa falla.
Revisar la documentación oficial: Available Validation Rules.
Unique y update
Ojo cuando apliquemos la regla unique en actualizaciones (update).
Si aplicamos la regla sin más va a fallar porque ya existe un registro con ese dato:
Debemos indicar que no tenga en cuenta el propio registro para comprobar esta regla:
Otros modos de validar
Hemos planteado la forma habitual pero existen otras:
Creando clases Request a la medida de una validación.
Creando clases Validator
Ambas soluciones son algo más sofisticadas y no las vamos a usar aunque podrían dar solución a situaciones más complejas.
Autorización: reglas y políticas
Laravel nos brinda dos sistemas para autorizar acciones: reglas y puertas.
Reglas
Las reglas se definen asociadas a la clase Gate.
Son una solución más simple.
Políticas
Son soluciones más elaboradas que engloban la autorización referida a un modelo concreto.
Se definen en clases dentro guardadas en app/Policies
Tienen una analogía a rutas y controladores, simpliciad vs complejidad y orden.
En un proyecteo usaremos una u otra (o ambas) de acuerdo a su complejidad y envergadura.
Definir reglas
Las reglas se definen en el AuthServiceProvider.php, dentro de su función boot.
Podemos definir una regla con un closure (función anónima) dentro de dicho método:
Usar reglas
Para comprobar las reglas debemos usar la fachada Gate y alguno de sus métodos (allows, denies). Lo podemos hacer en la propia ruta o más correctamente en el controlador o en un middleware:
Observa que el $user no es pasado a la clase Gate, toma el autenticado. Si quisieramos pasarlo debemos hacerlo así:
Políticas
Si el proyecto es pequeño la solución anterior es válida pero para algo grande puede no ser una buena solución.
Las políticas separan código para no sobrecargar el código del AuthServiceProvider.
Las políticas son clases guardadas en app/Policies y que se crean así:
Tras crear las políticas, éstas deben ser regitradas en el AuthServiceProvider:
Escribiendo las políticas:
Podemos crear los métodos que necesitemos. Por ejemplo el método update lo podemos usar para actualizar un objeto del modelo afectado. Sus argumentos deben ser el user y un objeto del modelo protegido:
El método before permite tomar decisiones generales sin evaluar la política
TODO:
Test
Modelos y BBDD
Errores
Eloquent & Query Builder
Relaciones
Multi Idioma
Ajax
Paginación
Mail
Pdf
Trabajo
Last updated