Instalación
Para instalar Laravel en tu entorno de desarrollo, sigue estos pasos:
Requisitos previos
- Servidor web: Apache o Nginx.
- PHP: Versión 8.1 o superior.
- Composer: El gestor de dependencias de PHP.
- Base de datos: MySQL, PostgreSQL, SQLite, o SQL Server.
Instalación paso a paso
Para instalar Laravel, existen varias formas:
Usando Composer (la forma más común):
- Instala Composer (administrador de dependencias PHP).
- Ejecuta el comando:
Usando Laravel Installer:
- Instala el instalador global:
- Luego, crea un nuevo proyecto:
- Instala el instalador global:
Clonando desde Git:
- Clona el repositorio de Laravel y luego ejecuta
composer install
.
- Clona el repositorio de Laravel y luego ejecuta
Inicia el servidor de desarrollo
Ejecuta el siguiente comando para iniciar un servidor local:
- php artisan serve
- Luego, visita
http://localhost:8000
en tu navegador para ver tu aplicación Laravel. - para detener la ejecicion realiza la combinacion de teclas Ctrl +C
- app/: Contiene el núcleo de la aplicación, incluidos los controladores, modelos, y middleware.
- routes/: Aquí se definen las rutas de la aplicación.
- resources/: Incluye vistas, archivos de traducción y plantillas Blade.
- database/: Contiene las migraciones y archivos de seeders para la base de datos.
- public/: Directorio raíz público (archivos accesibles desde el navegador).
También tiene carpetas como config/ (configuraciones), provider/ ( servicios ) y storage/ (archivos generados).
Laravel trabaja con varias peticiones HTTP como es GET, POST, PUT, PATCH, DELETE entre otras , vamos aver como es el majejo de estas peticiones.
Flujo general en laravel
El flujo general de Laravel sigue un proceso bien estructurado para gestionar cada solicitud HTTP desde el momento en que se recibe hasta el momento en que se envía una respuesta al cliente. A continuación, se detalla paso a paso el flujo de Laravel:
- Entrada de Solicitud: La solicitud HTTP ingresa a través de
public/index.php
. - Kernel: Laravel carga el Kernel HTTP, que define los middlewares globales y de grupo.
- Middlewares Globales: Se aplican los middlewares que afectan a todas las solicitudes.
- Flujo de una Solicitud con Grupos de Middlewares : son conjuntos de middlewares que se aplican a un grupo específico de rutas en la aplicación
- Enrutamiento: Laravel busca una ruta que coincida con la URL y el método de la solicitud.
- Middlewares de Ruta: Se aplican middlewares específicos de la ruta, si existen.
- Controlador: La solicitud es manejada por el controlador asignado, donde se ejecuta la lógica de aplicación.
- Generación de Respuesta: El controlador genera una respuesta adecuada (vista, JSON, redirección, etc.).
- Middleware de Respuesta: La respuesta pasa por middlewares finales, si es necesario.
- Salida de Respuesta: Laravel envía la respuesta al cliente, finalizando el ciclo.
Este flujo asegura que Laravel procese cada solicitud de manera ordenada, aplicando seguridad, lógica y configuración de forma coherente en cada paso del ciclo de vida de la solicitud.
1. Entrada de la Solicitud (Archivo public/index.php
)
public/index.php
es el punto de entrada principal de la aplicación para todas las solicitudes HTTP. Este archivo actúa como el intermediario que recibe cada solicitud entrante y la redirige al framework para ser procesada. En otras palabras, cualquier solicitud HTTP realizada hacia la aplicación Laravel pasa primero por este archivo antes de llegar a las rutas, controladores, o lógica de la aplicación.Paso a Paso de public/index.php
Configuración del Autoloader de Composer
- La primera línea en
index.php
carga el archivoautoload.php
de Composer, que se encuentra en la carpetavendor
. - Composer es el gestor de dependencias de PHP, y el autoloader permite que Laravel cargue todas las clases y dependencias de la aplicación de manera automática, sin tener que incluir manualmente cada archivo.
Esto asegura que todas las librerías y componentes externos que Laravel necesita estén disponibles cuando se inicie la aplicación.
- La primera línea en
Arranque del Framework Laravel
- Después del autoloader,
index.php
carga el archivo de inicio de Laravel (bootstrap/app.php
), que configura y prepara el framework para gestionar la solicitud. - Este archivo devuelve una instancia de la aplicación (
$app
), que es el núcleo de Laravel y contiene todos los componentes esenciales.
Aquí se configuran los componentes principales, como los proveedores de servicios y el contenedor de inyección de dependencias, y se define el entorno y las configuraciones de la aplicación.
- Después del autoloader,
Inicialización del Kernel
- Con la aplicación cargada, Laravel necesita determinar si la solicitud es una solicitud HTTP o un comando de consola.
2. Inicialización del Kernel (HTTP Kernel o Console Kernel)
El HTTP Kernel gestiona las solicitudes HTTP que llegan a través de un navegador o de una API. Cuando una solicitud HTTP entra a la aplicación, Laravel carga el HTTP Kernel, que organiza el flujo de la solicitud, define los middlewares globales y aplica los middlewares de rutas.1. HTTP Kernel (
app/Http/Kernel.php
)
El HTTP Kernel se inicializa en el archivopublic/index.php
con la línea:$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
Esta línea crea una instancia del HTTP Kernel, que luego se encargará de procesar la solicitud.Flujo en el HTTP Kernel:Componentes del HTTP Kernel
- Cuando una solicitud ingresa, el HTTP Kernel inicializa y ejecuta los middlewares globales.
- Luego, pasa la solicitud al enrutador (routes) para encontrar la ruta y aplicar los middlewares específicos de la misma.
- Finalmente, dirige la solicitud al controlador adecuado y gestiona la respuesta, aplicando cualquier middleware de salida antes de enviarla al cliente.
2. Console Kernel (
app/Console/Kernel.php
)- El Console Kernel es el núcleo que maneja todos los comandos de consola en Laravel. Se usa para ejecutar comandos como
php artisan
o para programar tareas de mantenimiento. - El Console Kernel se inicializa cuando se ejecuta un comando Artisan en la consola o terminal.
Componentes del Console Kernel
- Flujo en el Console Kernel:
- Al ejecutar un comando de consola, el Console Kernel se inicializa y determina qué comando debe ejecutarse.
- Ejecuta el comando (o una serie de comandos programados) y proporciona la salida en la consola.
- Esto permite programar y ejecutar tareas de mantenimiento, limpieza de bases de datos, generación de reportes, entre otros.
Comandos Registrados: En el Console Kernel, se definen los comandos personalizados que Laravel puede ejecutar. Estos comandos se registran en la propiedad
$commands
.Programación de Tareas: El Console Kernel también permite programar tareas mediante el método
schedule
. Este método utiliza el programador de tareas de Laravel, que permite ejecutar comandos de Artisan de forma periódica sin necesidad de configurar cron jobs directamente en el sistema.
Idea :
- El Console Kernel es el núcleo que maneja todos los comandos de consola en Laravel. Se usa para ejecutar comandos como
3. Aplicación de Middlewares Globales
En Laravel, los Middlewares Globales son un conjunto de filtros que se aplican automáticamente a todas las solicitudes HTTP que ingresan a la aplicación. Estos middlewares globales permiten manejar la lógica común y repetitiva para cada solicitud, como la validación de tamaño de entrada, manejo de excepciones, verificación de autenticación, manejo de sesiones y más.
¿Qué es un Middleware en Laravel?
Un middleware es una capa intermedia entre la solicitud y la lógica de la aplicación (controladores, rutas, etc.) que puede inspeccionar, modificar o rechazar la solicitud antes de que llegue a su destino final. Los middlewares en Laravel también pueden modificar la respuesta antes de enviarla de vuelta al cliente.
¿Dónde se Definen los Middlewares Globales?
Los middlewares globales se definen en el archivo
app/Http/Kernel.php
, dentro de la propiedad protegida$middleware
. Estos middlewares se aplican a todas las solicitudes que entran en la aplicación, sin importar la ruta o el controlador que se use.Principales Middlewares Globales en Laravel
CheckForMaintenanceMode
:- Este middleware verifica si la aplicación está en modo de mantenimiento. Si está activado, Laravel muestra una página de "Servicio no disponible" a todos los usuarios, exceptuando aquellos que tienen una IP autorizada en el archivo de configuración.
- Es útil para realizar actualizaciones y mantenimiento en la aplicación sin interrumpir el acceso a usuarios específicos.
ValidatePostSize
:- Este middleware asegura que la solicitud no exceda el tamaño máximo permitido.
- Si los datos enviados superan el límite definido en
post_max_size
de PHP, el middleware rechaza la solicitud y devuelve una respuesta de error antes de que la solicitud llegue a un controlador.
TrimStrings
:- Este middleware elimina los espacios en blanco de los valores de entrada (al inicio y al final de cada cadena).
- Ayuda a limpiar y estandarizar los datos de entrada, lo cual es útil para evitar errores relacionados con espacios adicionales.
ConvertEmptyStringsToNull
:- Convierte las cadenas vacías en valores
null
. - Esto es útil para manejar mejor los datos en la base de datos, ya que muchas aplicaciones prefieren
null
sobre cadenas vacías para valores faltantes.
- Convierte las cadenas vacías en valores
TrustProxies
:- Este middleware gestiona la configuración de proxies de confianza, permitiendo que la aplicación funcione correctamente en servidores que están detrás de un proxy o de servicios de carga de tráfico (como AWS Load Balancers).
- Configura correctamente la detección de la IP del usuario y el esquema de la URL (http o https) cuando la solicitud pasa por proxies.
¿Cómo Funcionan los Middlewares Globales en el Flujo de una Solicitud?
Solicitud Entrante:
- Cuando una solicitud HTTP entra en la aplicación a través de
public/index.php
, el kernel HTTP carga todos los middlewares globales definidos en$middleware
.
- Cuando una solicitud HTTP entra en la aplicación a través de
Ejecución Secuencial:
- Laravel ejecuta cada middleware en el orden en que están definidos en
$middleware
. - Cada middleware puede inspeccionar o modificar la solicitud antes de pasarla al siguiente middleware o detener el flujo si es necesario.
- Laravel ejecuta cada middleware en el orden en que están definidos en
Permitir o Rechazar:
- Cada middleware tiene la opción de rechazar la solicitud (por ejemplo, si está en modo mantenimiento) o permitir que continúe al siguiente middleware o al controlador.
Continuación de la Solicitud:
- Si la solicitud pasa todos los middlewares globales, Laravel la redirige a las rutas y controladores adecuados, donde se ejecutará la lógica de aplicación.
Ejemplo de Flujo de una Solicitud con Middlewares Globales
Imaginemos una solicitud que ingresa a la aplicación Laravel. El flujo con middlewares globales sería algo así:
Modo Mantenimiento:
CheckForMaintenanceMode
verifica si la aplicación está en modo mantenimiento. Si lo está, la solicitud se bloquea y devuelve un mensaje de "Mantenimiento". Si no, sigue al siguiente middleware.Validación de Tamaño:
ValidatePostSize
verifica que el tamaño de la solicitud no exceda el máximo permitido. Si lo hace, la solicitud se rechaza con un error. Si no, pasa al siguiente middleware.Limpieza de Espacios:
TrimStrings
elimina espacios en blanco en los datos de entrada, estandarizándolos para su uso en el controlador.Conversión de Vacíos a Null:
ConvertEmptyStringsToNull
convierte los campos de entrada vacíos anull
, asegurando una coherencia en los datos que recibirá la aplicación.Configuración de Proxies:
TrustProxies
ajusta la configuración de la solicitud si la aplicación está detrás de un proxy, estableciendo la IP correcta y el esquema de URL (http o https).Procesamiento de Rutas y Controladores: Si la solicitud pasa todos los middlewares, continúa hacia el sistema de rutas, donde Laravel asigna la solicitud al controlador o recurso adecuado para procesar la lógica de la aplicación.
4. Aplicación de Grupos de Middlewares
En Laravel, los grupos de middlewares son conjuntos de middlewares que se aplican a un grupo específico de rutas en la aplicación. Estos grupos permiten organizar y aplicar middlewares comunes de manera más eficiente a ciertas rutas, como las rutas de
web
oapi
, en lugar de aplicar middlewares globales a todas las solicitudes.¿Dónde se Definen los Grupos de Middlewares?
Los grupos de middlewares se definen en el archivo
app/Http/Kernel.php
, en la propiedad$middlewareGroups
. Laravel incluye dos grupos de middlewares principales por defecto:web
api
Explicación de los Grupos de Middlewares por Defecto
1. Grupo
web
Este grupo contiene middlewares necesarios para rutas que manejan páginas y autenticación. Los middlewares dentro del grupo
web
suelen realizar las siguientes tareas:EncryptCookies
: Encripta las cookies para mejorar la seguridad.AddQueuedCookiesToResponse
: Añade cookies en cola a la respuesta.StartSession
: Inicia la sesión del usuario. Es clave para manejar autenticación basada en sesiones, flashes de mensajes y otros datos de sesión.ShareErrorsFromSession
: Permite compartir errores de validación de sesiones con las vistas.VerifyCsrfToken
: Protege las solicitudes contra ataques CSRF (Cross-Site Request Forgery), lo que es esencial para proteger los formularios.SubstituteBindings
: Permite la inyección de modelos en las rutas automáticamente.
En resumen, el grupo
web
aplica middlewares que son necesarios para gestionar funcionalidades comunes en aplicaciones web, como sesiones, autenticación, cookies y CSRF.2. Grupo
api
Este grupo contiene middlewares que son ideales para rutas de API, generalmente aquellas que manejan datos y responden en JSON. Laravel incluye por defecto el middleware
throttle
, que permite limitar la tasa de solicitudes para prevenir abuso de la API, y el middlewareSubstituteBindings
, que facilita el enlace de modelos.throttle:api
: Establece una limitación de tasa de solicitudes. Esto ayuda a controlar cuántas veces un cliente puede hacer solicitudes en un periodo determinado (como 60 solicitudes por minuto).SubstituteBindings
: Inyecta automáticamente los modelos especificados en las rutas, lo cual es útil para manejar endpoints RESTful.
Estos middlewares ayudan a mantener las APIs seguras y rápidas al limitar las solicitudes y asegurar que los modelos se resuelvan adecuadamente en cada ruta.
Flujo de una Solicitud con Grupos de Middlewares
Cuando una solicitud coincide con una ruta que tiene un grupo de middlewares aplicado, Laravel aplica cada middleware en el orden en el que están definidos en el grupo.
Por ejemplo, si una solicitud coincide con una ruta en el grupo
web
:- Laravel aplica
EncryptCookies
para encriptar las cookies. - Luego, ejecuta
AddQueuedCookiesToResponse
para añadir las cookies en cola. - Inicia la sesión con
StartSession
. - Comparte los errores de validación con
ShareErrorsFromSession
. - Protege contra ataques CSRF con
VerifyCsrfToken
. - Por último, resuelve los enlaces de modelos con
SubstituteBindings
.
Cada middleware actúa en secuencia, permitiendo que la solicitud fluya a través de cada filtro hasta llegar al controlador o lógica final.
- Laravel aplica
5. Enrutamiento (Archivo de Rutas)
El enrutamiento en Laravel es el proceso de definir cómo las solicitudes HTTP son dirigidas a los controladores o a la lógica de la aplicación que responderá a dichas solicitudes. En Laravel, las rutas se definen en archivos de rutas específicos según el tipo de solicitud, y permiten asociar URLs con controladores, vistas o funciones anónimas.
Archivos de Rutas en Laravel
Laravel organiza sus rutas en diferentes archivos dentro de la carpeta
routes/
:web.php
: Contiene las rutas de la aplicación web. Estas rutas generalmente devuelven vistas HTML y suelen tener middlewares comoweb
aplicado automáticamente, lo que habilita el uso de sesiones, protección CSRF, y otras funcionalidades específicas para aplicaciones web.api.php
: Contiene las rutas para las APIs RESTful de la aplicación. Estas rutas suelen devolver datos en formato JSON y tienen el middlewareapi
aplicado automáticamente, lo que incluye características como la limitación de la tasa de solicitudes (rate limiting).console.php
: Define comandos personalizados de consola usando Artisan. No maneja solicitudes HTTP, sino que permite ejecutar lógica personalizada en la terminal.channels.php
: Define los canales de transmisión para las notificaciones en tiempo real de Laravel, como los que se usan con WebSockets o servicios como Pusher.
Tipos de Rutas en Laravel
Laravel ofrece varias maneras de definir rutas para cubrir diferentes necesidades de la aplicación:
Rutas Básicas:
- Son las rutas más simples que responden a un único tipo de solicitud.
- Ejemplo:
Rutas Dirigidas a Controladores
Laravel permite definir rutas que envíen las solicitudes a métodos específicos dentro de un controlador, promoviendo la separación de lógica y organización del código.
Ejemplo de ruta a un controlador en
web.php
:Rutas de Recursos:
- Laravel permite definir rutas que siguen los estándares RESTful utilizando un solo método
Route::resource
. Este método crea automáticamente rutas para las acciones más comunes (index, create, store, show, edit, update, destroy) de un controlador de recursos. - Ejemplo:
- Esto genera rutas como:
GET /posts
-index
(muestra todos los posts)POST /posts
-store
(almacena un nuevo post)GET /posts/{post}
-show
(muestra un post específico)PUT/PATCH /posts/{post}
-update
(actualiza un post específico)DELETE /posts/{post}
-destroy
(elimina un post específico)
- Laravel permite definir rutas que siguen los estándares RESTful utilizando un solo método
Rutas con Parámetros:
- Laravel permite definir rutas con parámetros que capturan valores de la URL, como IDs.
- Ejemplo:
- Cuando un usuario visita
/user/1
, Laravel pasa el valor1
al métodoshow
del controladorUserController
.
Rutas con Parámetros Opcionales:
- Se puede definir un parámetro como opcional usando el símbolo
?
. - Ejemplo:
- Si el usuario no proporciona el parámetro
name
, Laravel usará el valorGuest
como predeterminado.
- Se puede definir un parámetro como opcional usando el símbolo
Rutas con Middleware:
- Los middlewares se pueden aplicar a rutas individuales o grupos de rutas. Esto es útil para proteger rutas o aplicar reglas de negocio a solicitudes específicas.
- Ejemplo:
Agrupación de Rutas
Laravel permite agrupar rutas que comparten características comunes (como el middleware o un prefijo de URL) mediante el método
Route::group
.Ejemplo de agrupación de rutas con prefijo y middleware:
En este ejemplo:
prefix('admin')
aplica el prefijo/admin
a todas las rutas del grupo, por lo que'/dashboard'
se convierte en'/admin/dashboard'
.middleware(['auth', 'is_admin'])
aplica los middlewaresauth
eis_admin
a todas las rutas del grupo.
Nombres de Rutas
Laravel permite asignar nombres a las rutas usando el método
name
. Esto es útil para referenciar rutas en lugar de URLs, facilitando el mantenimiento de la aplicación si las URLs cambian en el futuro.Ejemplo:
Luego, se puede usar el nombre de la ruta en lugar de la URL en las vistas o controladores:
6. Ejecución de Middlewares de Rutas (Opcional)
Los middlewares de rutas en Laravel son capas de lógica que se ejecutan antes o después de que una solicitud HTTP llegue al controlador. Su función es interceptar las solicitudes para aplicar reglas específicas, como verificación de autenticación, protección contra ataques CSRF, limitación de tasa de solicitudes, entre otras. Laravel permite asignar middlewares a rutas individuales o a grupos de rutas para modular y simplificar el flujo de solicitudes en la aplicación.
Ejemplos de Usos Comunes de Middlewares de Rutas
- Autenticación: Se usa para asegurar que solo los usuarios autenticados accedan a ciertas rutas.
- Autorización de Roles: Verifica si un usuario tiene el rol o permiso adecuado para acceder a una ruta.
- Protección CSRF (Cross-Site Request Forgery): Previene que aplicaciones externas puedan hacer solicitudes a la aplicación en nombre del usuario sin su consentimiento.
- Limitación de Tasa (Rate Limiting): Controla cuántas veces una solicitud específica puede ser ejecutada en un determinado periodo.
- Cifrado de Cookies: Permite cifrar y descifrar cookies automáticamente en rutas específicas.
Middlewares de Ruta Comunes en Laravel
auth
- Descripción: Verifica si el usuario está autenticado. Si no lo está, redirige a la página de inicio de sesión.
- Uso: Se utiliza para proteger rutas que deben ser accesibles solo por usuarios autenticados.
guest
- Descripción: Verifica si el usuario no está autenticado. Si el usuario está autenticado, redirige a otra ruta, generalmente a la página de inicio o al dashboard.
- Uso: Se utiliza en rutas de registro o inicio de sesión, asegurando que un usuario autenticado no pueda acceder a estas páginas.
throttle
- Descripción: Limita el número de solicitudes que un usuario puede realizar a una ruta en un período determinado (rate limiting). El límite y el tiempo de la ventana pueden ser configurables.
- Uso: Se utiliza para proteger APIs y evitar abusos por parte de los usuarios.
verified
- Descripción: Verifica si el usuario ha verificado su dirección de correo electrónico. Se usa en combinación con el registro de usuarios.
- Uso: Se aplica a rutas que solo deberían ser accesibles para usuarios que han verificado su correo electrónico.
bindings
- Descripción: Proporciona la funcionalidad de modelo de enlace, que permite que Laravel busque automáticamente instancias de modelos según los parámetros de las rutas.
- Uso: Se utiliza para facilitar el enlace de parámetros de ruta a modelos, permitiendo pasar instancias de modelos directamente a los controladores.
can
- Descripción: Permite aplicar la autorización basada en políticas a rutas. Verifica si el usuario autenticado tiene permiso para realizar una acción específica.
- Uso: Se utiliza para proteger rutas según las políticas de autorización definidas en la aplicación.
role (Middleware Personalizado)
- Descripción: Middleware personalizado que verifica si el usuario tiene un rol específico (por ejemplo,
admin
,manager
). - Uso: Se utiliza en rutas que requieren roles específicos para acceder.
Ejemplo de Middleware en Laravel
Laravel incluye varios middlewares predeterminados, También se pueden definir middlewares personalizados y luego asignarlos a rutas.
Ejemplo de asignación de middleware
auth
a una ruta para asegurar que solo los usuarios autenticados puedan acceder a ella:En este caso:
auth
: Este middleware verifica si el usuario está autenticado. Si no lo está, Laravel redirige al usuario a la página de inicio de sesión.
Asignación de Múltiples Middlewares a una Ruta
Es posible asignar múltiples middlewares a una misma ruta. Esto se hace pasando un arreglo de middlewares como parámetro del método
middleware
.Ejemplo:
En este caso:
auth
verifica que el usuario esté autenticado.is_admin
(un middleware personalizado) verifica que el usuario autenticado tenga el rol de administrador.
Grupos de Rutas con Middlewares
Para aplicar middlewares a un conjunto de rutas, se pueden agrupar dentro de un
Route::group
con la opciónmiddleware
.Ejemplo:
En este ejemplo, las rutas
/profile
y/settings
requieren que el usuario esté autenticado y que su correo electrónico esté verificado (verified
es un middleware predeterminado de Laravel para verificar cuentas de usuario).Definir y Registrar Middlewares Personalizados
1. Creación de un Middleware
Laravel permite crear middlewares personalizados mediante el comando Artisan:
Esto crea un archivo
CheckRole.php
enapp/Http/Middleware
. Dentro de este middleware, se puede definir la lógica personalizada.Ejemplo de un middleware
CheckRole
que verifica el rol del usuario:En este caso:
handle
: Es el método principal del middleware. Recibe la solicitud$request
y un callback$next
que ejecuta la siguiente capa de la solicitud si se cumple la condición.$role
: Es un parámetro adicional que permite especificar un rol, lo cual es útil para reutilizar el mismo middleware para diferentes roles.
2. Registro del Middleware
Para usar el middleware en rutas, se debe registrar en el archivo
Kernel.php
:3. Aplicación del Middleware en una Ruta
Con el middleware
role
registrado, ahora se puede aplicar a una ruta especificando el rol requerido:En este caso:
- La ruta
/admin
solo será accesible si el usuario tiene el roladmin
. De lo contrario, será redirigido a/home
.
Middleware de Rutas con Parámetros
Los middlewares en Laravel pueden recibir parámetros que permiten ajustar su comportamiento. Esto es especialmente útil para middlewares personalizados.
Ejemplo de middleware con parámetro:
Aquí,
manager
es pasado como parámetro al middlewarerole
, que luego verifica si el usuario tiene el rolmanager
antes de permitirle el acceso.Flujo de Ejecución de Middlewares de Rutas
- Solicitud Entrante: Un usuario realiza una solicitud HTTP a una ruta específica.
- Aplicación de Middlewares: Laravel verifica si la ruta tiene middlewares asignados y los ejecuta en el orden en que están definidos.
- Control del Acceso: Si algún middleware falla (como en el caso de una verificación de autenticación), la solicitud es redirigida o rechazada.
- Acceso Permitido: Si todos los middlewares pasan, la solicitud llega al controlador o a la lógica de la aplicación.
- Ejecución de la Respuesta: Luego de ejecutar la lógica de la ruta, Laravel regresa la respuesta al cliente.
7. Controlador y Lógica de Aplicación
En Laravel, un controlador es una clase que gestiona la lógica de la aplicación relacionada con una solicitud HTTP específica. Se encarga de recibir la solicitud, procesar datos, interactuar con modelos (que representan la lógica de negocio y la base de datos), y devolver una respuesta adecuada al cliente, ya sea en forma de vistas (HTML) o datos (JSON, XML, etc.).
1. Controlador
Definición
- Un controlador es responsable de recibir la solicitud de un usuario, procesar esa solicitud y devolver una respuesta. En Laravel, los controladores son clases ubicadas en el directorio
app/Http/Controllers
.
Tipos de Controladores
Controladores Básicos:
- Un controlador es responsable de recibir la solicitud de un usuario, procesar esa solicitud y devolver una respuesta. En Laravel, los controladores son clases ubicadas en el directorio
- Son clases que contienen métodos que manejan rutas específicas.
Controladores de Recursos:
- Controladores que siguen las convenciones RESTful y se generan utilizando el comando Artisan
php artisan make:controller
. - Manejan automáticamente las operaciones CRUD (Create, Read, Update, Delete)
- Controladores Invocables: Son controladores de un solo método (__invoke) y se usan cuando una ruta necesita ejecutar solo una acción.
- La lógica de aplicación se refiere a las reglas y procesos que definen el comportamiento de la aplicación. Incluye la forma en que los datos se manejan, se procesan y se devuelven al usuario. Esto puede incluir la validación de datos, la autorización, la manipulación de modelos y la interacción con servicios externos.
Interacción con Modelos:
- Los controladores interactúan con modelos para obtener, guardar o modificar datos en la base de datos. Los modelos representan las entidades de la aplicación y encapsulan la lógica de acceso a datos.
Validación de Datos:
- Antes de procesar la entrada del usuario, se deben validar los datos. Laravel proporciona un sistema robusto de validación que puede implementarse en los controladores.
Autorización:
- La lógica de aplicación también implica verificar que el usuario tenga los permisos adecuados para realizar ciertas acciones. Esto se puede gestionar mediante políticas y gates en Laravel.
Manejo de Errores:
- Es importante gestionar errores y excepciones dentro de la lógica de la aplicación para proporcionar una buena experiencia de usuario y evitar que la aplicación falle silenciosamente.
Devolución de Respuestas:
- Al finalizar la lógica de aplicación, el controlador debe devolver una respuesta al cliente. Esto puede ser una vista HTML, una redirección o una respuesta JSON.
2. Lógica de Aplicación
Definición
Funciones de la Lógica de Aplicación
Métodos de un Controlador de Recursos
Cuando se crea un controlador de recursos en Laravel, se incluyen los siguientes métodos:
· index(): Muestra una lista de todos los recursos.
· create(): Muestra un formulario para crear un nuevo recurso.
· store(): Almacena un nuevo recurso en la base de datos.
· show(): Muestra un recurso específico.
· edit(): Muestra un formulario para editar un recurso específico.
· update(): Actualiza un recurso en la base de datos.
· destroy(): Elimina un recurso de la base de datos.
Métodos Adicionales Comunes en Controladores
Además de estos métodos estándar de un controlador de recursos, en Laravel se pueden definir otros métodos personalizados para manejar lógica adicional específica de la aplicación, tales como:
· search(): Para buscar recursos específicos según ciertos parámetros.
· activate() / deactivate(): Para activar o desactivar recursos (común en sistemas con lógica de estado).
· duplicate(): Para crear una copia de un recurso existente.
Tipos de Peticiones HTTP en Laravel
Laravel admite varias peticiones HTTP, que usualmente se asocian a métodos específicos en los controladores:
1.
Aquí tienes una lista de los tipos de peticiones HTTP más comunes y sus usos:
2.
1.
GET:
2.
§ Se usa para recuperar datos de un servidor sin modificar los recursos.
§ Ejemplo: Obtener la lista de usuarios o ver un artículo en un blog.
3.
POST:
4.
§ Se utiliza para enviar datos al servidor y crear nuevos recursos.
§ Ejemplo: Enviar un formulario para crear una cuenta de usuario.
5.
PUT:
6.
§ Se emplea para actualizar un recurso existente en el servidor, enviando los datos completos del recurso.
§ Ejemplo: Actualizar toda la información de un perfil de usuario.
7.
PATCH:
8.
§ Similar a PUT, pero se usa para actualizar parcialmente un recurso, enviando solo los campos que se desean modificar.
§ Ejemplo: Cambiar solo el nombre de usuario sin modificar otros datos del perfil.
9.
DELETE:
10.
§ Se utiliza para eliminar un recurso en el servidor.
§ Ejemplo: Borrar una cuenta de usuario.
11.
HEAD:
12.
§ Similar a GET, pero solo recupera los encabezados de la respuesta, sin el cuerpo del contenido.
§ Útil para verificar la existencia de un recurso o la última modificación.
13.
OPTIONS:
14.
§ Solicita los métodos HTTP permitidos para un recurso específico.
§ Ejemplo: Verificar si el recurso permite GET, POST, o DELETE.
15.
CONNECT:
16.
§ Establece una conexión de túnel con el servidor, generalmente para conexiones seguras mediante SSL.
§ Usado en proxies HTTP para establecer una comunicación segura.
17.
TRACE:
18.
§ Permite realizar una prueba de bucle de solicitud para ver cómo se enrutó, devolviendo la solicitud original recibida por el servidor.
§ Se usa para depurar problemas de red o de proxy.
19.
PURGE (no estándar):
20.
§ Se utiliza en cachés (por ejemplo, Varnish) para eliminar una versión en caché de un recurso.
§ No es un método oficial HTTP, pero es soportado por algunos servidores de caché.
21.
LINK y UNLINK (propuestos):
22.
§ LINK se usa para establecer una relación entre el recurso solicitado y otros recursos.
§ UNLINK se usa para eliminar una relación entre recursos.
Resumen de los más usados en APIs RESTful:
o GET: Recuperar información.
o POST: Crear un nuevo recurso.
o PUT: Actualizar completamente un recurso.
o PATCH: Actualizar parcialmente un recurso.
o DELETE: Eliminar un recurso.
Estos métodos permiten realizar operaciones CRUD (Crear, Leer, Actualizar, Eliminar) en la mayoría de las aplicaciones web y servicios RESTful.
8. Generación de la Respuesta
- La generación de la respuesta en Laravel es el proceso en el cual la aplicación produce una respuesta para enviar al cliente una vez que ha procesado una solicitud HTTP. Este proceso incluye desde la ejecución de la lógica en los controladores hasta la entrega de la respuesta final al usuario, que puede ser una página HTML, un archivo, una respuesta JSON o incluso un mensaje de error.
Tipos de Respuestas en Laravel
Laravel permite generar diferentes tipos de respuestas según las necesidades de la aplicación:
Respuesta de Vista (HTML)
- Para la mayoría de las aplicaciones web, las respuestas son páginas HTML que se devuelven al usuario.
- Laravel utiliza Blade, su motor de plantillas, para renderizar vistas con datos dinámicos.
- Ejemplo:
Respuesta JSON
- Es común en aplicaciones API y se usa para enviar datos estructurados en formato JSON.
- Laravel tiene métodos integrados que facilitan la creación de respuestas JSON.
- Ejemplo:
Redirección
- Las redirecciones se utilizan para enviar al usuario a otra URL o ruta, útil después de operaciones como un inicio de sesión, creación o eliminación de un recurso.
- Ejemplo:
Descarga de Archivos
- Laravel permite que los controladores devuelvan archivos para que el usuario los descargue, como archivos PDF, imágenes, o documentos.
- Ejemplo:
Respuestas Personalizadas
- Laravel permite crear respuestas personalizadas con configuraciones específicas de encabezados, estado, y contenido.
- Ejemplo:
Configuración de Encabezados y Códigos de Estado
Laravel permite configurar encabezados HTTP y códigos de estado, personalizando completamente la respuesta. Ejemplo de uso:
Respuesta de Error
En caso de un error, Laravel proporciona varias formas de manejar y personalizar las respuestas de error. Laravel incluye una configuración predeterminada para los códigos de error comunes, como 404 (No encontrado) y 500 (Error del servidor).
Las respuestas del servidor en una petición HTTP, también conocidas como códigos de estado HTTP, indican si una solicitud fue procesada con éxito o si hubo algún problema. Estas se agrupan en cinco categorías principales:
1. 1xx - Informativas
· 100 Continue: El servidor recibió parte de la solicitud y el cliente puede continuar.
· 101 Switching Protocols: El cliente solicitó un cambio de protocolo, y el servidor acepta.
· 102 Processing: El servidor ha recibido la solicitud y la está procesando, pero aún no tiene una respuesta final.
2. 2xx - Éxito
· 200 OK: La solicitud se procesó correctamente y el servidor devuelve el recurso solicitado.
· 201 Created: Un recurso fue creado exitosamente como resultado de la solicitud.
· 202 Accepted: La solicitud fue aceptada para procesamiento, pero aún no se ha completado.
· 203 Non-Authoritative Information: La respuesta fue obtenida de un recurso diferente al servidor original.
· 204 No Content: La solicitud fue exitosa, pero no se envía contenido en la respuesta.
· 205 Reset Content: La solicitud fue exitosa, pero el cliente debería restablecer la vista del documento.
· 206 Partial Content: El servidor está enviando solo una parte del recurso, usualmente como respuesta a una solicitud de rango.
3. 3xx - Redirecciones
· 300 Multiple Choices: Hay múltiples opciones para el recurso solicitado.
· 301 Moved Permanently: El recurso solicitado ha sido movido permanentemente a una nueva URL.
· 302 Found: El recurso solicitado está temporalmente en una URL diferente.
· 303 See Other: La respuesta a la solicitud se encuentra en otra URL, y el cliente debería usar el método GET para recuperarla.
· 304 Not Modified: El recurso no ha cambiado desde la última solicitud, por lo que el cliente puede usar su versión en caché.
· 307 Temporary Redirect: Similar a 302, pero con la intención explícita de que el método de la solicitud no cambie.
· 308 Permanent Redirect: Similar a 301, pero con la intención explícita de que el método de la solicitud no cambie.
4. 4xx - Errores del Cliente
· 400 Bad Request: La solicitud es inválida o tiene una sintaxis incorrecta.
· 401 Unauthorized: El cliente debe autenticarse para acceder al recurso solicitado.
· 402 Payment Required: Reservado para uso futuro (originalmente planeado para indicar requerimiento de pago).
· 403 Forbidden: El cliente no tiene permisos para acceder al recurso.
· 404 Not Found: El servidor no pudo encontrar el recurso solicitado.
· 405 Method Not Allowed: El método HTTP utilizado no está permitido para el recurso.
· 406 Not Acceptable: El recurso no es compatible con los encabezados Accept de la solicitud.
· 407 Proxy Authentication Required: Similar a 401, pero requiere autenticación a través de un proxy.
· 408 Request Timeout: El servidor agotó el tiempo de espera para la solicitud.
· 409 Conflict: La solicitud no se pudo procesar debido a un conflicto en el estado del recurso.
· 410 Gone: El recurso solicitado ya no está disponible y no se proporcionará una redirección.
· 411 Length Required: El servidor requiere que se envíe el encabezado Content-Length.
· 412 Precondition Failed: Alguna condición previa en los encabezados de la solicitud falló.
· 413 Payload Too Large: El servidor no puede procesar la solicitud porque es demasiado grande.
· 414 URI Too Long: La URI de la solicitud es demasiado larga.
· 415 Unsupported Media Type: El formato de los datos enviados no es compatible con el servidor.
· 416 Range Not Satisfiable: El servidor no puede proporcionar la parte del recurso solicitada.
· 417 Expectation Failed: El servidor no puede cumplir con el encabezado Expect de la solicitud.
· 418 I'm a teapot: Un código de broma de la especificación de Hyper Text Coffee Pot Control Protocol (HTCPCP).
· 429 Too Many Requests: El cliente ha enviado demasiadas solicitudes en un periodo corto (generalmente se usa para limitación de velocidad).
5. 5xx - Errores del Servidor
· 500 Internal Server Error: Ocurrió un error inesperado en el servidor.
· 501 Not Implemented: El servidor no reconoce o no tiene implementado el método de la solicitud.
· 502 Bad Gateway: El servidor, actuando como gateway o proxy, recibió una respuesta inválida.
· 503 Service Unavailable: El servidor no está disponible, generalmente debido a mantenimiento o sobrecarga.
· 504 Gateway Timeout: El servidor, actuando como gateway o proxy, agotó el tiempo de espera para la respuesta.
· 505 HTTP Version Not Supported: El servidor no soporta la versión HTTP de la solicitud.
· 507 Insufficient Storage: El servidor no puede guardar la representación necesaria para completar la solicitud.
· 508 Loop Detected: El servidor detectó un bucle infinito al procesar la solicitud (generalmente en WebDAV).
· 511 Network Authentication Required: El cliente debe autenticarse para obtener acceso a la red.
Resumen de Códigos Comunes
· 2xx (Éxito): 200 (OK), 201 (Created)
· 3xx (Redirecciones): 301 (Moved Permanently), 302 (Found), 304 (Not Modified)
· 4xx (Errores del Cliente): 400 (Bad Request), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found)
· 5xx (Errores del Servidor): 500 (Internal Server Error), 502 (Bad Gateway), 503 (Service Unavailable)
Las peticiones HTTP y los códigos de estado HTTP están ligadas porque los códigos de estado son la forma en que el servidor comunica al cliente el resultado de una petición. Cada vez que un cliente (como un navegador web o una aplicación) envía una solicitud HTTP al servidor, este responde con un código de estado HTTP que indica si la solicitud se procesó correctamente, si hubo errores o si se requieren acciones adicionales.
Imaginemos que un cliente envía una solicitud POST para crear un nuevo recurso en una API:
1. El servidor puede responder con un 201 Created si el recurso se creó exitosamente.
2. Si el cliente envía datos incompletos, el servidor responderá con un 400 Bad Request indicando que algo está mal en la solicitud.
3. Si el cliente intenta crear un recurso que ya existe, el servidor puede responder con un 409 Conflict.
4. Si el servidor está temporalmente fuera de servicio, la respuesta será 503 Service Unavailable.
En cada caso, el código de estado define la acción subsiguiente y permite una comunicación clara y estructurada entre el cliente y el servidor.
En resumen, los códigos de estado HTTP son esenciales para que las peticiones HTTP sean procesadas de manera coherente, manejando respuestas claras y acciones para que tanto el cliente como el servidor puedan reaccionar de forma adecuada ante el resultado de cada solicitud.
En Laravel, las solicitudes HTTP están asociadas a métodos específicos dentro de los controladores. Estos métodos permiten gestionar la lógica de cada tipo de solicitud (GET, POST, PUT, DELETE, etc.), de modo que Laravel facilita la implementación de las operaciones CRUD en los recursos de la aplicación.
Aquí está la asociación entre las solicitudes HTTP comunes y los métodos de controlador de Laravel cuando se utiliza un controlador de recursos (resource controller).
· GET :
o Metodo en el controlador : index
o Descripción : Muestra una lista de recursos.
o Ejemplo : /posts
o Metodo en el controlador : create
o Descripción : Muestra un formulario para crear un nuevo recurso.
o Ejemplo : /posts/create
o Metodo en el controlador : show
o Descripción : Muestra un recurso específico.
o Ejemplo : /posts/{id}
o Metodo en el controlador : edit
o Descripción : Muestra un formulario para editar un recurso existente.
o Ejemplo :/posts/{id}/edit
· POST:
o Metodo en el controlador : store
o Descripción : Procesa el formulario de creación y guarda el recurso.
o Ejemplo : /posts (almacena datos enviados desde un formulario)
· PUT:
o Metodo en el controlador : update
o Descripción : Procesa el formulario de edición y actualiza el recurso.
o Ejemplo :/posts/{id}
· DELETE
o Metodo en el controlador : destroy
o Descripción : Elimina un recurso específico.
o Ejemplo :/posts/{id}
· PATCH
o Metodo en el controlador : update
o Descripción : Procesa el formulario de edición y actualiza el recurso.
o Ejemplo :/posts/{id}
9. Middleware de Respuesta (Opcional)
En Laravel, el Middleware de Respuesta se refiere a aquellos middlewares que manipulan la respuesta justo antes de enviarla al cliente. Los middlewares en Laravel son intermediarios que interceptan tanto las solicitudes entrantes como las respuestas salientes, permitiendo modificar, inspeccionar o incluso rechazar una solicitud o respuesta.
¿Cómo funciona el Middleware de Respuesta?
Cuando una solicitud llega a Laravel, pasa por los middlewares que la procesan antes de llegar al controlador. Una vez que la lógica del controlador genera una respuesta, esa respuesta también pasa por los middlewares antes de ser devuelta al cliente. Los middlewares de respuesta interceptan esta respuesta y pueden realizar tareas específicas como añadir encabezados HTTP, comprimir el contenido, o aplicar reglas de caché.
Ejemplos Comunes de Middleware de Respuesta en Laravel
Middleware de Autenticación
- Si la solicitud proviene de un usuario autenticado, el middleware permite que llegue al controlador y luego procesa la respuesta generada.
- Por ejemplo, puede agregar encabezados de autenticación a la respuesta.
Middleware de CORS (Cross-Origin Resource Sharing)
- Este middleware puede añadir encabezados relacionados con CORS en la respuesta para definir qué dominios pueden acceder a los recursos de la API.
Middleware de Cache-Control
- Este middleware puede añadir encabezados de control de caché para mejorar el rendimiento, permitiendo a los navegadores o proxies almacenar respuestas en caché.
Middleware de Compresión de Respuesta
- Algunos middlewares pueden comprimir la respuesta para reducir el tamaño de los datos enviados al cliente, mejorando la velocidad de carga y reduciendo el uso de ancho de banda.
Middleware de Modificación de Contenido
- Los middlewares pueden modificar el contenido de la respuesta antes de que se envíe al cliente. Por ejemplo, algunos middlewares podrían minificar el HTML, agregar analíticas o realizar alguna transformación específica en el cuerpo de la respuesta.
Middlewares de Respuesta Comunes en Laravel
TrimStrings:
- Elimina automáticamente los espacios en blanco de ambos lados de los valores de entrada. Esto es útil para asegurar que los datos no tengan espacios accidentales antes o después de ser enviados.
ConvertEmptyStringsToNull:
- Convierte cualquier cadena vacía a
null
en los datos de entrada. Esto es útil para manejar datos opcionales o valores que no se han enviado.
- Convierte cualquier cadena vacía a
Cors (Cross-Origin Resource Sharing):
- Gestiona las configuraciones de CORS, permitiendo que se configuren encabezados de respuesta como
Access-Control-Allow-Origin
, necesarios para controlar el acceso de otras aplicaciones a los recursos de la API.
- Gestiona las configuraciones de CORS, permitiendo que se configuren encabezados de respuesta como
EncryptCookies:
- Encripta las cookies antes de enviarlas al navegador. Este middleware protege las cookies almacenadas en el navegador del usuario.
AddQueuedCookiesToResponse:
- Añade cookies en cola a la respuesta antes de que esta se envíe al usuario. Útil cuando se necesita enviar cookies adicionales después de que la lógica principal de la solicitud haya sido procesada.
SetCacheHeaders:
- Añade encabezados de caché a la respuesta para controlar cómo los navegadores y proxies deben almacenar o no la respuesta en caché.
VerifyCsrfToken:
- Añade el token CSRF (Cross-Site Request Forgery) a la respuesta para validar las solicitudes provenientes del usuario, protegiendo contra ataques CSRF.
SubstituteBindings:
- Sustituye automáticamente los parámetros en las rutas por los valores correspondientes en la respuesta final, permitiendo una mejor organización de los datos al prepararlos para su envío al cliente.
Middlewares Adicionales y Personalizados
Además de los middlewares incluidos, puedes crear middlewares personalizados de respuesta en Laravel. Estos pueden realizar tareas como:
- Añadir encabezados personalizados para información adicional (por ejemplo, analítica o metadatos).
- Modificar el contenido de la respuesta, como aplicar compresión o cifrado adicional.
- Gestionar políticas de autenticación o autorización específicas en la respuesta final.
Para crear un middleware personalizado en Laravel:
Usa el comando Artisan:
En el archivo creado (
app/Http/Middleware/CustomResponseMiddleware.php
), puedes añadir lógica para manipular la respuesta. Ejemplo para añadir un encabezado:
10. Salida de la Respuesta
La Salida de la Respuesta o Respuesta Final en Laravel es el último paso en el ciclo de vida de una solicitud HTTP. En este punto, Laravel ha procesado completamente la solicitud, ejecutado la lógica de la aplicación y pasado por todos los middlewares. La respuesta generada se envía de vuelta al cliente, quien originalmente hizo la solicitud, ya sea un navegador, una aplicación móvil, o cualquier otro cliente.
Proceso de Generación y Envío de la Respuesta Final
Generación de la Respuesta:
- La respuesta se crea después de que el controlador correspondiente en la aplicación ha procesado la lógica necesaria. Esto incluye consultas a la base de datos, manipulación de datos, y la preparación de la vista o de la estructura de datos a enviar.
Modificación de la Respuesta con Middlewares de Respuesta:
- Antes de enviarse, la respuesta pasa por los middlewares de respuesta, que pueden modificarla al añadir encabezados HTTP, configurar políticas de caché o comprimir el contenido.
Envío de la Respuesta:
- Una vez que la respuesta está lista, Laravel la envía a través del servidor web (como Apache o Nginx) y se dirige al cliente. En este paso, el servidor web la transforma en un formato adecuado (usualmente HTTP) para que el cliente pueda interpretarla.
Tipos de Respuestas Finales en Laravel
Dependiendo del tipo de solicitud y de la lógica aplicada, la respuesta final puede variar en Laravel. Algunos de los tipos de respuesta comunes incluyen:
- HTML: Generalmente, cuando se retorna una vista, el cliente recibe un HTML renderizado a través del motor Blade.
- JSON: Muy común en APIs RESTful, donde el cliente recibe datos estructurados en JSON.
- Archivos: Laravel puede generar respuestas que permiten al usuario descargar archivos, como documentos PDF o imágenes.
- Redirecciones: En lugar de una página o datos, el cliente recibe una redirección a otra URL.
- Errores y Códigos de Estado HTTP: Cuando ocurre un error (como un 404 o 500), Laravel envía la respuesta con el código de estado adecuado.
Consulta a DB
- Migraciones: Definen la estructura de la base de datos. Al ejecutar las migraciones, se crean las tablas que luego se utilizarán para almacenar los datos.
- Esquemas: Representan la estructura de las tablas y las relaciones
- Query Builder: Ofrece una alternativa más flexible para construir consultas SQL sin utilizar modelos.
- Modelos: Representan las tablas en la base de datos y proporcionan métodos para interactuar con ellas. Los modelos utilizan Eloquent para facilitar las operaciones CRUD.
Punto importante.
- Si la migración crea una tabla nueva, esa tabla se añadirá a la base de datos.
- Si la migración modifica una tabla existente, se aplicarán los cambios indicados (agregar, cambiar o eliminar columnas, crear índices, etc.).
- Si la migración elimina una tabla, esa tabla será eliminada de la base de datos.
Conexion DB
- DB_CONNECTION=mysql
- Indica el tipo de base de datos con la que estás trabajando, en este caso es MySQL. Esto le dice a tu aplicación que use el controlador de MySQL para conectarse a la base de datos.
- DB_HOST=127.0.0.1
- Especifica la dirección del servidor de base de datos. 127.0.0.1 es la dirección IP local, también conocida como "localhost". Esto significa que la base de datos está en la misma máquina donde corre la aplicación.
- DB_PORT=3306
- Define el puerto de conexión de MySQL, que por defecto es 3306.
- DB_DATABASE=nombre_base_datos
- El nombre de la base de datos a la cual la aplicación se conectará. Debes cambiar nombre_base_datos por el nombre real de tu base de datos.
- DB_USERNAME=usuario
- Especifica el nombre de usuario que la aplicación utilizará para acceder a la base de datos.
- DB_PASSWORD=contraseña
- Define la contraseña del usuario especificado en DB_USERNAME para acceder a la base de datos.
Crear la Migración
Explicación
Importamos al inicio
Illuminate\Database\Migrations\Migration
: Esteuse
importa la clase baseMigration
, de la cual heredan todas las migraciones en Laravel.Illuminate\Database\Schema\Blueprint
: Esteuse
importa la claseBlueprint
, que se usa para definir la estructura de las tablas (columnas, tipos de datos, etc.).Illuminate\Support\Facades\Schema
: Esteuse
importa la claseSchema
, que se utiliza para realizar operaciones con las tablas en la base de datos, como crear o eliminar tablas.
Definición de la Clase de la Migración
CreatePostsTable
: Este es el nombre de la clase de migración. En Laravel, las migraciones generalmente tienen nombres descriptivos, comoCreatePostsTable
, para indicar su propósito (crear la tablaposts
).- La clase hereda de
Migration
, lo que significa que tiene acceso a los métodosup()
ydown()
que definen los cambios que se realizarán en la base de datos.
Método
up()
public function up()
: Este método define los cambios que se aplicarán a la base de datos cuando se ejecute la migración.Schema::create('nombre_tabla', function (Blueprint $table) { ... })
: Usa el métodocreate
de la claseSchema
para crear una nueva tabla llamadanombre_tabla
.- Dentro del callback de
create
:$table->id()
: Crea una columnaid
de tipo entero, autoincremental y que actúa como clave primaria de la tabla.$table->string('campo')
: Crea una columna llamadacampo
de tipostring
(cadena de texto) para almacenar texto.$table->timestamps()
: Crea dos columnas,created_at
yupdated_at
, que almacenan las marcas de tiempo de creación y actualización de cada registro de manera automática.
Método
down()
public function down()
: Este método define cómo revertir los cambios hechos en el métodoup()
. Es utilizado cuando ejecutasphp artisan migrate:rollback
para deshacer una migración.Schema::dropIfExists('nombre_tabla')
: Elimina la tablanombre_tabla
si existe en la base de datos, lo que deshace los cambios realizados en el métodoup()
.
up()
y down()
. Estos son fundamentales para definir cómo aplicar y revertir los cambios en la base de datos.En Laravel, una migración generalmente utiliza varios métodos clave que permiten crear, modificar o eliminar tablas y columnas en la base de datos. Aquí tienes una lista de los métodos más importantes y comunes en las migraciones de Laravel:
Métodos Principales para Crear y Modificar Tablas
Schema::create()
- Se utiliza para crear una nueva tabla en la base de datos.
- Sintaxis:
Schema::table()
- Modifica una tabla existente. Útil para agregar, modificar o eliminar columnas después de la creación inicial de la tabla.
- Sintaxis:
Schema::dropIfExists()
- Elimina la tabla especificada si existe en la base de datos.
- Sintaxis:
Schema::rename()
- Cambia el nombre de una tabla existente.
- Sintaxis:
Métodos Comunes para Definir Columnas en Migraciones
Tipos de Columnas
- Métodos como
id()
,bigIncrements()
,string()
,text()
,integer()
,boolean()
, etc., definen el tipo de columna que se añadirá a la tabla. - Ejemplo:
- Métodos como
Relaciones (Claves Foráneas)
foreignId()
: Define una columna que será utilizada como clave foránea y, usualmente, referencia a una columnaid
de otra tabla.constrained()
: Establece automáticamente una relación con una tabla usando convenciones de nombres.onDelete()
yonUpdate()
: Definen el comportamiento en caso de eliminación o actualización en cascada.- Ejemplo:
Modificadores de Columnas
nullable()
: Permite que la columna acepte valores nulos.unique()
: Define la columna como única en la tabla.default()
: Establece un valor por defecto para la columna.unsigned()
: Define que el valor de la columna debe ser positivo.- Ejemplo:
Métodos para Claves Primarias e Índices
primary()
- Define una columna o conjunto de columnas como clave primaria.
- Ejemplo:
unique()
- Define una columna o un grupo de columnas como únicas.
- Ejemplo:
index()
- Añade un índice a la columna para optimizar consultas.
- Ejemplo:
dropPrimary()
,dropUnique()
,dropIndex()
ydropForeign()
- Métodos para eliminar una clave primaria, un índice único, un índice normal o una clave foránea de la tabla.
- Ejemplo:
Métodos de Gestión de Columnas
renameColumn()
- Cambia el nombre de una columna existente.
- Ejemplo:
dropColumn()
- Elimina una o varias columnas de una tabla.
- Ejemplo:
Métodos Adicionales
timestamps()
- Crea dos columnas
created_at
yupdated_at
que almacenan las marcas de tiempo de creación y actualización de cada registro. - Ejemplo:
- Crea dos columnas
softDeletes()
- Añade una columna
deleted_at
para implementar el borrado suave de registros. - Ejemplo:
- Añade una columna
rememberToken()
- Crea una columna
remember_token
, utilizada comúnmente en autenticación. - Ejemplo:
- Crea una columna
Algunas de las funciones más comunes que se usan dentro de una migración en Laravel para definir las columnas de una tabla son las siguientes:
Tipos de Columnas
Enteros y Números
increments('id')
: Crea una columna de clave primaria de tipo entero autoincremental.integer('column_name')
: Crea una columna de tipo entero.bigInteger('column_name')
: Crea una columna de tipo entero grande.tinyInteger('column_name')
: Crea una columna de tipo entero pequeño.unsignedBigInteger('column_name')
: Crea una columna de entero grande sin signo, utilizada comúnmente para claves foráneas.float('column_name', total, places)
: Crea una columna de tipo número en coma flotante.decimal('column_name', total, places)
: Crea una columna de tipo decimal.double('column_name', total, places)
: Crea una columna de tipo número en coma doble flotante.boolean('column_name')
: Crea una columna de tipo booleano.
Cadenas de Texto
string('column_name', length)
: Crea una columna de tipo cadena de texto con una longitud específica.text('column_name')
: Crea una columna de tipo texto (más grande questring
).mediumText('column_name')
: Crea una columna de tipo texto mediano.longText('column_name')
: Crea una columna de tipo texto largo.char('column_name', length)
: Crea una columna de tipochar
con longitud fija.
Fechas y Tiempos
date('column_name')
: Crea una columna de tipo fecha.datetime('column_name', precision)
: Crea una columna de tipo fecha y hora.timestamp('column_name', precision)
: Crea una columna de tipo marca de tiempo (timestamp).time('column_name', precision)
: Crea una columna de tipo hora.year('column_name')
: Crea una columna de tipo año.softDeletes()
: Añade una columnadeleted_at
para el borrado suave de registros.timestamps()
: Crea dos columnascreated_at
yupdated_at
para registrar fechas de creación y actualización.
Otros Tipos de Columnas
binary('column_name')
: Crea una columna de tipo binario.json('column_name')
: Crea una columna de tipo JSON.uuid('column_name')
: Crea una columna de tipo UUID.
Modificadores de Columnas
Además de los tipos de columnas, Laravel proporciona modificadores que se pueden encadenar a las columnas para personalizar su comportamiento:
Modificadores Comunes
nullable()
: Permite que la columna acepte valores nulos.default(value)
: Establece un valor predeterminado para la columna.unique()
: Define la columna como única en la tabla.index()
: Añade un índice en la columna.unsigned()
: Define la columna como un número sin signo.
Modificadores para Relaciones
foreign('column_name')
: Define una clave foránea.references('id')
: Especifica la columna de referencia para una clave foránea.on('table')
: Especifica la tabla de referencia para una clave foránea.onDelete('action')
: Define una acción de eliminación en cascada o restrictiva para claves foráneas.onUpdate('action')
: Define una acción de actualización en cascada o restrictiva para claves foráneas.
Funciones para Modificar Tablas
Laravel también ofrece funciones para cambiar, eliminar o verificar el estado de las columnas y tablas en migraciones:
Modificar Estructura de Tablas
Schema::table('nombre_tabla', function (Blueprint $table) { ... })
: Modifica la estructura de una tabla existente.renameColumn('old_name', 'new_name')
: Cambia el nombre de una columna.dropColumn('column_name')
: Elimina una columna.dropIfExists('table_name')
: Elimina una tabla si existe.
Eliminar o Modificar Índices y Claves Foráneas
dropIndex(['column_name'])
: Elimina un índice.dropUnique(['column_name'])
: Elimina un índice único.dropForeign(['column_name'])
: Elimina una clave foránea.
Modelo
1. Crear la Migración de la Tabla
Primero, debes asegurarte de que tienes la migración que define la estructura de la tabla. Supongamos que tienes la siguiente migración para crear una tabla posts
:
Aquí estamos creando una tabla posts
con las columnas id
, title
, content
, status
, created_at
, y updated_at
.
2. Ejecutar la Migración
Para crear la tabla en la base de datos, ejecuta el siguiente comando en tu terminal:
Este comando aplicará la migración y creará la tabla posts
en la base de datos.
3. Crear el Modelo de Eloquent
Para crear un modelo que interactúe con la tabla posts
, usa el comando make:model
de Artisan:
Esto generará un archivo Post.php
en el directorio app/Models
. Laravel automáticamente asume que el modelo Post
está asociado con la tabla posts
, ya que sigue las convenciones de nombres de Eloquent (el modelo en singular y la tabla en plural).
4. Configurar el Modelo
Abre el archivo app/Models/Post.php
y verifica su configuración. A continuación se muestra un ejemplo de cómo podría verse el modelo:
Explicación de las Propiedades del Modelo
$fillable
: Especifica las columnas que se pueden asignar masivamente. Esto permite usarcreate()
oupdate()
sin riesgos de asignación de atributos no permitidos.$table
(opcional): Si el nombre de la tabla no sigue la convención de Eloquent (nombre del modelo en singular y tabla en plural), puedes especificarlo manualmente aquí.$timestamps
(opcional): Si tu tabla no tiene columnascreated_at
yupdated_at
, puedes desactivar el manejo de timestamps estableciendo esta propiedad afalse
.
5. Uso del Modelo para Interactuar con la Tabla
Ahora puedes usar el modelo Post
para interactuar con la tabla posts
. Aquí algunos ejemplos:
Insertar un Registro (CREATE)
Consultar Registros (READ)
Actualizar un Registro (UPDATE)
O también puedes usar el método update()
:
Eliminar un Registro (DELETE)
O eliminar varios registros:
Resumen
- Crear la migración para definir la estructura de la tabla.
- Ejecutar la migración con
php artisan migrate
para crear la tabla. - Crear el modelo usando
php artisan make:model
. - Configurar el modelo para asignación masiva y otros ajustes opcionales.
- Usar el modelo para interactuar con la tabla usando métodos de Eloquent como
create()
,all()
,find()
,update()
, ydelete()
.
Estos pasos te permiten trabajar con la tabla de forma segura y organizada usando Eloquent ORM en Laravel.
En Laravel, Eloquent ORM utiliza convenciones de nombres para vincular un modelo a una tabla en la base de datos sin necesidad de configuraciones adicionales.
Convenciones de Nombres en Eloquent
Por defecto, Laravel sigue las siguientes convenciones para determinar a qué tabla debe hacer referencia un modelo:
Nombre de la Tabla en Plural y Minúsculas: Laravel asume que la tabla asociada a un modelo es el nombre del modelo en plural y en minúsculas.
- Ejemplo: Si tienes un modelo
Post
, Laravel asumirá que la tabla correspondiente esposts
. - Ejemplo: Si tienes un modelo
Category
, Laravel asumirá que la tabla escategories
.
- Ejemplo: Si tienes un modelo
Sobre escribir la Tabla (Opcional): Si el nombre de la tabla no sigue esta convención, puedes especificarlo manualmente en el modelo utilizando la propiedad
$table
.En este ejemplo, aunque el modelo se llama
Post
, al definir la propiedad$table
como'nombre_personalizado'
, Eloquent trabajará con esa tabla en lugar de asumirposts
.
¿Cómo Determina Eloquent la Tabla?
Eloquent determina la tabla de la siguiente forma:
Primero, verifica si el modelo tiene la propiedad
$table
. Si está definida, usará el valor de esta propiedad como el nombre de la tabla.Si
$table
no está definida, Eloquent aplica automáticamente la convención: toma el nombre del modelo en singular y lo convierte a plural y en minúsculas.User
➔users
OrderItem
➔order_items
Ejemplo Práctico
Migración
Supongamos que tienes una migración que crea la tabla blog_posts
:
Modelo con $table
Como la tabla blog_posts
no sigue la convención de nombres para el modelo Post
(que sería posts
), debes especificar la propiedad $table
en el modelo Post
:
De esta forma, Eloquent sabrá que el modelo Post
debe interactuar con la tabla blog_posts
, en lugar de buscar posts
.
Resumen
- Laravel determina la tabla asociada a un modelo mediante la convención de nombres, convirtiendo el nombre del modelo a plural y minúsculas.
- Puedes especificar manualmente el nombre de la tabla en el modelo usando la propiedad
$table
cuando el nombre de la tabla no sigue la convención.
Estas convenciones y opciones de configuración permiten a Eloquent ORM trabajar de forma intuitiva y flexible con las tablas en la base de datos.
Atributos
Eloquent proporciona varios atributos configurables en los modelos de Laravel para personalizar su comportamiento. Estos atributos permiten controlar desde el nombre de la tabla hasta la forma en que se manejan los atributos de fechas y relaciones.
A continuación, te enlisto los atributos más importantes de Eloquent y su funcionalidad:
1. $table
- Especifica el nombre de la tabla en la base de datos.
- Ejemplo:
protected $table = 'nombre_tabla';
2. $primaryKey
- Define el nombre de la columna que actúa como clave primaria.
- Ejemplo:
protected $primaryKey = 'post_id';
3. $keyType
- Define el tipo de la clave primaria, generalmente
'int'
o'string'
(por ejemplo, si usas UUIDs). - Ejemplo:
protected $keyType = 'string';
4. $incrementing
- Determina si la clave primaria es autoincremental.
- Ejemplo:
protected $incrementing = false;
5. $timestamps
- Indica si el modelo debe gestionar automáticamente las columnas
created_at
yupdated_at
. - Ejemplo:
public $timestamps = false;
6. $fillable
- Define las columnas que permiten asignación masiva en el modelo, útiles para
create()
oupdate()
. - Ejemplo:
protected $fillable = ['title', 'content', 'status'];
7. $guarded
- Especifica las columnas que no deben ser asignadas masivamente, como una alternativa a
$fillable
. - Ejemplo:
protected $guarded = ['id'];
8. $hidden
- Oculta ciertos atributos cuando el modelo es convertido a un array o JSON.
- Ejemplo:
protected $hidden = ['password', 'remember_token'];
9. $visible
- Especifica únicamente los atributos que serán visibles cuando el modelo sea convertido a un array o JSON.
- Ejemplo:
protected $visible = ['name', 'email'];
10. $casts
- Convierte automáticamente los atributos a un tipo específico cuando se accede a ellos.
- Ejemplo:
protected $casts = ['is_active' => 'boolean', 'created_at' => 'datetime'];
11. $dates
- Especifica qué atributos se deben tratar como instancias de Carbon (para compatibilidad con fechas).
- Ejemplo:
protected $dates = ['published_at'];
12. $dateFormat
- Define el formato de almacenamiento de fechas en la base de datos.
- Ejemplo:
protected $dateFormat = 'Y-m-d H:i:s';
13. $connection
- Permite especificar una conexión de base de datos diferente para el modelo, si es necesario.
- Ejemplo:
protected $connection = 'mysql_alternative';
14. $with
- Indica las relaciones que deben ser cargadas automáticamente cada vez que se obtenga el modelo.
- Ejemplo:
protected $with = ['comments', 'author'];
15. $withCount
- Carga el conteo de relaciones junto con el modelo.
- Ejemplo:
protected $withCount = ['comments'];
16. $morphClass
- Define el nombre de la clase polimórfica para relaciones polimórficas.
- Ejemplo:
protected $morphClass = 'Product';
17. $touches
- Lista de relaciones que deben ser “tocadas” (actualizar su
updated_at
) cuando el modelo es actualizado. - Ejemplo:
protected $touches = ['post'];
18. $perPage
- Define el número de resultados por página al paginar consultas.
- Ejemplo:
protected $perPage = 20;
19. $observables
- Define métodos observables personalizados que se pueden disparar en el ciclo de vida del modelo.
- Ejemplo:
protected $observables = ['approved'];
Metodos
En los modelos de Eloquent en Laravel, existen numerosos métodos que te permiten interactuar con la base de datos de una manera sencilla y elegante. Estos métodos se utilizan para realizar operaciones CRUD (Crear, Leer, Actualizar, Eliminar), trabajar con relaciones, manipular atributos y más. A continuación, te enlisto los métodos más importantes de Eloquent y su funcionalidad:
Métodos Básicos de CRUD
create(array $attributes): Crea un nuevo registro en la base de datos y lo guarda.
- Ejemplo:
Post::create(['title' => 'Nuevo Post', 'content' => 'Contenido del post']);
- Ejemplo:
find($id): Busca un registro por su clave primaria.
- Ejemplo:
$post = Post::find(1);
- Ejemplo:
findOrFail($id): Busca un registro por su clave primaria y lanza una excepción si no se encuentra.
- Ejemplo:
$post = Post::findOrFail(1);
- Ejemplo:
first(): Obtiene el primer registro que cumple las condiciones de la consulta.
- Ejemplo:
$post = Post::where('status', 'published')->first();
- Ejemplo:
firstOrFail(): Obtiene el primer registro que cumple las condiciones o lanza una excepción si no existe.
- Ejemplo:
$post = Post::where('status', 'draft')->firstOrFail();
- Ejemplo:
all(): Obtiene todos los registros de la tabla.
- Ejemplo:
$posts = Post::all();
- Ejemplo:
update(array $attributes): Actualiza los atributos de un registro existente.
- Ejemplo:
$post->update(['title' => 'Título Actualizado']);
- Ejemplo:
save(): Guarda el modelo actual en la base de datos (se usa tanto para crear como actualizar).
- Ejemplo:
$post->save();
- Ejemplo:
delete(): Elimina el modelo de la base de datos.
- Ejemplo:
$post->delete();
- Ejemplo:
destroy($ids): Elimina uno o varios registros por su clave primaria.
- Ejemplo:
Post::destroy(1);
oPost::destroy([1, 2, 3]);
- Ejemplo:
Métodos de Consulta
where($column, $operator = null, $value = null, $boolean = 'and'): Añade una condición
WHERE
a la consulta.- Ejemplo:
Post::where('status', 'published')->get();
- Ejemplo:
orWhere($column, $operator = null, $value = null): Añade una condición
OR
a la consulta.- Ejemplo:
Post::where('status', 'draft')->orWhere('status', 'published')->get();
- Ejemplo:
orderBy($column, $direction = 'asc'): Ordena los resultados por una columna.
- Ejemplo:
Post::orderBy('created_at', 'desc')->get();
- Ejemplo:
groupBy(...$groups): Agrupa los resultados por una o más columnas.
- Ejemplo:
Post::groupBy('category_id')->get();
- Ejemplo:
count(): Cuenta el número de registros que coinciden con las condiciones de la consulta.
- Ejemplo:
Post::where('status', 'published')->count();
- Ejemplo:
pluck($column): Obtiene un conjunto de valores de una sola columna.
- Ejemplo:
Post::pluck('title');
- Ejemplo:
get(): Ejecuta la consulta y obtiene los resultados.
- Ejemplo:
$posts = Post::where('status', 'published')->get();
- Ejemplo:
limit($value): Limita el número de resultados.
- Ejemplo:
Post::limit(10)->get();
- Ejemplo:
paginate($perPage = 15): Pagina los resultados de la consulta.
- Ejemplo:
Post::paginate(10);
- Ejemplo:
Métodos de Relaciones
hasOne(): Define una relación de uno a uno.
- Ejemplo:
public function user() { return $this->hasOne(User::class); }
- Ejemplo:
hasMany(): Define una relación de uno a muchos.
- Ejemplo:
public function comments() { return $this->hasMany(Comment::class); }
- Ejemplo:
belongsTo(): Define una relación de muchos a uno.
- Ejemplo:
public function author() { return $this->belongsTo(User::class); }
- Ejemplo:
belongsToMany(): Define una relación de muchos a muchos.
- Ejemplo:
public function tags() { return $this->belongsToMany(Tag::class); }
- Ejemplo:
morphTo(): Define una relación polimórfica inversa.
- Ejemplo:
public function imageable() { return $this->morphTo(); }
- Ejemplo:
morphMany(): Define una relación polimórfica de uno a muchos.
- Ejemplo:
public function comments() { return $this->morphMany(Comment::class, 'commentable'); }
- Ejemplo:
attach($id, array $attributes = []): Adjunta un modelo en una relación muchos a muchos.
- Ejemplo:
$post->tags()->attach($tagId);
- Ejemplo:
detach($id): Desvincula un modelo en una relación muchos a muchos.
- Ejemplo:
$post->tags()->detach($tagId);
- Ejemplo:
sync($ids): Sincroniza una relación muchos a muchos, agregando o eliminando según sea necesario.
- Ejemplo:
$post->tags()->sync([1, 2, 3]);
- Ejemplo:
Métodos de Atributos y Conversión
toArray(): Convierte el modelo en un array.
- Ejemplo:
$postArray = $post->toArray();
- Ejemplo:
toJson(): Convierte el modelo en un JSON.
- Ejemplo:
$postJson = $post->toJson();
- Ejemplo:
getAttribute($key): Obtiene el valor de un atributo del modelo.
- Ejemplo:
$title = $post->getAttribute('title');
- Ejemplo:
setAttribute($key, $value): Establece el valor de un atributo del modelo.
- Ejemplo:
$post->setAttribute('title', 'Nuevo título');
- Ejemplo:
Otros Métodos Útiles
refresh(): Recarga el modelo desde la base de datos.
- Ejemplo:
$post->refresh();
- Ejemplo:
replicate(): Crea una copia del modelo actual.
- Ejemplo:
$newPost = $post->replicate();
- Ejemplo:
exists: Propiedad que verifica si el modelo existe en la base de datos.
- Ejemplo:
if ($post->exists) { ... }
- Ejemplo:
wasChanged($attribute = null): Verifica si un atributo específico o cualquier atributo fue cambiado.
- Ejemplo:
if ($post->wasChanged('title')) { ... }
- Ejemplo:
Estos métodos cubren gran parte de la funcionalidad que ofrece Eloquent para gestionar modelos y relaciones, permitiéndote trabajar con la base de datos de una manera más limpia y orientada a objetos en Laravel.
Metodos con operaciones
Eloquent en Laravel proporciona una amplia variedad de métodos y atributos para facilitar el trabajo con bases de datos. Aquí te presento algunos de los más útiles y comunes, junto con una breve descripción de cada uno:
1. Relaciones y Carga Anticipada
with
: Permite hacer carga anticipada (eager loading) de relaciones para evitar consultas adicionales.load
: Similar awith
, pero se utiliza en una instancia existente para cargar relaciones adicionales después de obtener los datos.has
: Filtra los registros que tienen una relación específica.whereHas
: Filtra los registros con condiciones en una relación.withCount
: Carga el recuento de registros de una relación en una consulta.
2. Filtros Básicos de Consultas
where
: Agrega una condiciónWHERE
en la consulta.orWhere
: Agrega una condiciónOR
en la consulta.whereBetween
: Filtra registros entre dos valores.whereIn
: Filtra registros donde un valor está dentro de un conjunto de valores.whereNull
ywhereNotNull
: Filtra registros donde un campo esNULL
oNOT NULL
.
3. Orden y Limite de Resultados
orderBy
: Ordena los resultados por una columna específica.latest
yoldest
: Atajos para ordenar por la columnacreated_at
en orden descendente o ascendente.take
olimit
: Limita el número de resultados obtenidos.skip
: Omite una cantidad específica de registros.
4. Agrupamiento y Agregación
groupBy
: Agrupa los resultados por una columna o conjunto de columnas.having
: Agrega una condición sobre los grupos (usualmente con agregaciones).Métodos de Agregación:
count
,sum
,avg
,min
,max
, etc.
5. Relaciones Avanzadas
withTrashed
: Incluye los registros eliminados lógicamente (soft-deletes) en el resultado.onlyTrashed
: Obtiene solo los registros eliminados lógicamente.restore
: Restaura un registro eliminado lógicamente.forceDelete
: Elimina un registro de la base de datos permanentemente, sin importar soft-deletes.
6. Otras Utilidades de Consultas
firstOrCreate
: Busca un registro; si no existe, lo crea.firstOrNew
: Similar afirstOrCreate
, pero no guarda automáticamente el registro en la base de datos.updateOrCreate
: Actualiza un registro existente o lo crea si no existe.chunk
: Procesa grandes cantidades de datos en porciones para optimizar el rendimiento.
Resumen
Estos métodos te permiten trabajar de manera flexible con los datos en la base de datos. Laravel Eloquent incluye opciones avanzadas que facilitan la creación de consultas complejas y la interacción con relaciones, datos agregados y condiciones.
Metodo boot
El método boot
en los modelos de Eloquent de Laravel es un método estático especial que se ejecuta automáticamente cuando el modelo es inicializado. Este método permite definir comportamientos personalizados y configurar eventos de modelo (como creating
, updating
, deleting
, etc.) de una manera centralizada.
Propósito del Método boot
El método boot
se utiliza principalmente para:
- Definir eventos de modelo: Realizar acciones automáticas antes o después de ciertos eventos, como crear, actualizar o eliminar un registro.
- Configurar comportamientos globales: Aplicar lógicas que deben ser ejecutadas de manera global en el modelo, como la aplicación de scopes o configuraciones de soft deletes.
Ejemplo Básico de Uso del Método boot
A continuación, un ejemplo de cómo utilizar el método boot
en un modelo:
Explicación del Código
parent::boot()
: Llama al métodoboot
de la claseModel
base de Eloquent, lo cual es importante para asegurarse de que todas las configuraciones de Eloquent se inicialicen correctamente antes de añadir lógica adicional.Eventos: Los eventos de Eloquent permiten ejecutar lógica específica antes o después de ciertas operaciones:
creating
: Se ejecuta antes de que un registro sea creado en la base de datos.updating
: Se ejecuta antes de que un registro existente sea actualizado.deleting
: Se ejecuta antes de que un registro sea eliminado.created
,updated
,deleted
: Se ejecutan después de que las operaciones de creación, actualización o eliminación han sido realizadas.
Ejemplo Completo con Varios Eventos
Lista de Eventos Comunes en Eloquent
Laravel permite ejecutar estos eventos en los modelos:
retrieved
: Cuando un modelo es recuperado de la base de datos.creating
: Antes de que un modelo sea creado.created
: Después de que un modelo es creado.updating
: Antes de actualizar un modelo existente.updated
: Después de actualizar un modelo existente.saving
: Antes de crear o actualizar un modelo.saved
: Después de crear o actualizar un modelo.deleting
: Antes de eliminar un modelo.deleted
: Después de eliminar un modelo.restoring
: Antes de restaurar un modelo con soft delete.restored
: Después de restaurar un modelo con soft delete.
Usos Comunes del Método boot
- Auditoría: Registrar acciones como creación, actualización o eliminación en un archivo de log o en una tabla de auditoría.
- Configuración de Valores Predeterminados: Establecer valores predeterminados para ciertos campos antes de crear o actualizar un registro.
- Enviar Notificaciones: Enviar notificaciones al crear o actualizar un registro.
- Soft Deletes: Ejecutar lógica específica cuando un registro es eliminado sin borrarse físicamente (soft delete).
Ejemplo Práctico de un Scope Global en boot
El método boot
también permite definir scopes globales para que ciertos filtros se apliquen automáticamente a todas las consultas:
En este ejemplo, todas las consultas que involucren el modelo Post
solo devolverán registros donde el campo status
sea igual a 'active'
, a menos que el scope global sea eliminado temporalmente.
Resumen
El método boot
en los modelos de Eloquent es útil para:
- Definir comportamientos globales.
- Ejecutar acciones automáticamente al crear, actualizar o eliminar registros.
- Configurar scopes globales para agregar filtros predeterminados en todas las consultas del modelo.
Con este método puedes personalizar los comportamientos del modelo y asegurarte de que ciertas operaciones se realicen automáticamente, manteniendo el código organizado y limpio.
Separar la manipulación de datos
Facades (fachadas)
Los facades (o fachadas) en el desarrollo de software son una técnica de diseño que simplifica la interacción con sistemas complejos mediante una interfaz única. Este patrón es común en Laravel, un framework PHP, donde las fachadas actúan como puntos de acceso fáciles a diversas funcionalidades del sistema sin que el usuario deba gestionar las instancias o dependencias manualmente. En lugar de invocar directamente las clases internas del sistema, una fachada proporciona métodos estáticos que abstraen y simplifican el proceso.
En Laravel, algunos de los "facades" más utilizados y sus propósitos son:
- App: Proporciona acceso a la instancia de la aplicación, útil para acceder a servicios y configuraciones.
- Artisan: Permite ejecutar comandos de Artisan desde el código.
- Auth: Maneja autenticación de usuarios.
- Cache: Facilita el almacenamiento y recuperación de datos en caché.
- Config: Permite acceso a la configuración de la aplicación.
- DB: Proporciona acceso a la base de datos mediante el "query builder".
- Event: Facilita la gestión y emisión de eventos.
- File: Maneja el sistema de archivos.
- Log: Gestiona el registro de logs en el sistema.
- Mail: Permite el envío de correos electrónicos.
- Queue: Maneja colas de trabajos en segundo plano.
- Redirect: Redirige a otras rutas o URLs.
- Request: Accede a la solicitud HTTP actual.
- Response: Facilita la creación de respuestas HTTP.
- Route: Gestiona rutas y su registro.
- Session: Maneja las sesiones de usuario.
- Storage: Facilita el acceso al almacenamiento de archivos.
- URL: Genera URLs en la aplicación.
- Validator: Valida datos según reglas específicas.
- View: Carga vistas y comparte datos con ellas.
Estos facades simplifican el acceso a funcionalidades del framework y ayudan a mantener un código más limpio y estructurado.
Vistas (View)
El siguiente elemento que se necesita ver son las Vistas (View) .Las vistas son responsables de generar el HTML que se envía al navegador del usuario y se utilizan para separar la lógica de negocio (manejada por los controladores y modelos) . Los controladores y las vistas se vinculan a través de rutas (routes).
En Laravel, una vista (view) es un archivo que contiene el código de presentación de la aplicación, es decir, el HTML y cualquier otro lenguaje de plantilla que formará la interfaz de usuario visible. Laravel usa Blade, su propio motor de plantillas, para facilitar la creación de vistas dinámicas que pueden incluir lógica simple, como bucles y condiciones, mientras mantienen el enfoque en la presentación de los datos.
Características de las Vistas en Laravel
- Ubicación: Las vistas se encuentran en la carpeta
resources/views/
y suelen tener la extensión.blade.php
, que indica que usan el motor de plantillas Blade. - Separación de Lógica y Presentación: Las vistas se encargan únicamente de la presentación, dejando la lógica de negocio y manipulación de datos en los controladores y modelos.
- Reutilización: Blade permite reutilizar componentes y plantillas a través de herencia y componentes, lo que facilita mantener la consistencia en el diseño.
Blade, el motor de plantillas de Laravel, ofrece una variedad de comandos para simplificar la presentación de datos y la lógica en las vistas. A continuación, te presento algunos de los comandos y directivas más comunes y útiles que puedes usar en Blade:
1. Mostrar Datos
{{ ... }}
: Para mostrar datos de manera segura (escapando HTML).{!! ... !!}
: Para mostrar datos sin escapar HTML. Úsalo solo con contenido seguro.
2. Comentarios en Blade
{{-- Comentario --}}
: Los comentarios en Blade no se muestran en el HTML resultante.
3. Directivas de Estructura de Control
Condicionales
@if
,@elseif
,@else
,@endif
: Condicionales para lógica en la vista.@isset
y@empty
: Para verificar si una variable está definida o está vacía.@unless
: Ejecuta el bloque si la condición es falsa (similar aif
con!
).
Bucles
@for
,@endfor
: Para iteraciones basadas en un contador.@foreach
,@endforeach
: Para iterar sobre un array.@forelse
,@empty
,@endforelse
: Para iterar y mostrar un mensaje si el array está vacío.@while
,@endwhile
: Para bucleswhile
.
Control de Bucles
@break
y@continue
: Para controlar la ejecución de un bucle.$loop
: Al usar@foreach
, Laravel genera una variable$loop
que contiene información del bucle.
4. Incluyendo Otras Vistas
@include
: Para insertar otra vista en la plantilla actual.@includeIf
: Incluye la vista solo si esta existe.@includeWhen
: Incluye la vista si la condición es verdadera.@includeFirst
: Incluye la primera vista que se encuentre.
5. Secciones y Herencia de Plantillas
@extends
: Define que la vista actual extiende un layout o plantilla base.@section
y@endsection
: Define una sección que se inyecta en el layout.@yield
: En el layout, marca el lugar donde se inyectará el contenido de una sección.
6. Componentes y Slots
Los componentes permiten crear elementos reutilizables con lógica propia.
Definir un Componente: En
resources/views/components
, crea un archivo Blade para el componente, comoalert.blade.php
.Usar un Componente en una Vista:
Slots Nombrados: Permiten pasar secciones específicas al componente.
7. JSON en Blade
@json
: Para transformar datos en formato JSON.
8. Otras Directivas Útiles
@csrf
: Añade un campo token CSRF en formularios.@method
: Define métodos HTTP en formularios que no seanPOST
.@auth
y@guest
: Para verificar si un usuario está autenticado o no.
Estos comandos y directivas en Blade permiten escribir vistas dinámicas y seguras en Laravel, simplificando la lógica de presentación y mejorando la organización de las plantillas.
Recuperar información
En Laravel, puedes recuperar información de una URL o de una página de diferentes maneras, dependiendo de la fuente de la información. Aquí te explico las dos opciones más comunes: recuperar datos desde una URL externa y recuperar datos de una URL dentro de tu aplicación (o de un formulario enviado por el usuario).
1. Recuperar Información de una URL Externa (API Externa)
Si deseas recuperar datos de una URL externa, como una API de terceros, puedes usar el cliente HTTP de Laravel. Desde Laravel 7 en adelante, se introdujo el método Http::get()
en el componente HTTP para manejar estas solicitudes de manera sencilla.
Paso 1: Configurar la Solicitud HTTP a una URL Externa
Usa el facade Http
para realizar solicitudes GET
, POST
, PUT
, etc., a una URL externa.
En este ejemplo:
Http::get('url')
realiza una solicitudGET
a una URL externa.$response->successful()
verifica si la solicitud fue exitosa.$response->json()
convierte la respuesta JSON en un array PHP.
Ejemplo Completo en un Controlador
Puedes poner esta lógica en un controlador para acceder y procesar datos desde una API externa.
Paso 2: Crear la Vista para Mostrar los Datos
En el archivo resources/views/apiData.blade.php
, puedes mostrar los datos recuperados:
2. Recuperar Información de una URL de tu Aplicación (Por ejemplo, un Formulario)
Si deseas recuperar información desde un formulario o parámetros en la URL de tu propia aplicación, puedes usar el objeto Request
.
Recuperar Parámetros de una URL
Supongamos que tienes una URL como https://tu-dominio.com/buscar?query=laravel
.
Definir la Ruta: En tu archivo
web.php
, define una ruta que capture los parámetros de la URL:Recuperar el Parámetro en el Controlador:
En tu controlador, puedes usar el objeto
Request
para obtener el parámetro de la URL.Crear la Vista para Mostrar los Resultados:
En el archivo
resources/views/searchResults.blade.php
:
Recuperar Datos de un Formulario
Si deseas recuperar datos enviados desde un formulario, puedes configurar el formulario para que envíe los datos a una ruta específica y, luego, procesarlos en el controlador.
Formulario en la Vista:
Definir la Ruta en
web.php
:Procesar los Datos en el Controlador:
Resumen
Recuperar datos de una URL externa: Usa el cliente HTTP de Laravel (
Http::get()
) para hacer solicitudes a API externas y procesar los datos.Recuperar datos de una URL de tu aplicación: Usa el objeto
Request
en el controlador para acceder a los parámetros de la URL y procesarlos.Recuperar datos desde un formulario: Define un formulario en la vista, envíalo a una ruta en tu aplicación y utiliza el controlador para procesar los datos recibidos desde el formulario.
Con estos métodos, puedes trabajar con datos de URLs tanto externas como internas en tu aplicación Laravel.