Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ESTUDIANTE:
FLORES MENDOZA MANUEL
TAPIA ESPINOZA JHORDAN
VALERIO PACHECO JHENDER
VILLAVICENCIO TORRES AXEL
YBAÑEZ VILLEGAS LUIGGI
Consistencia y flexibilidad
Los marcos abordan este problema proporcionando una respuesta cuidadosamente
considerada a la pregunta "¿Qué componente deberíamos usar aquí?" y asegurando
que los componentes particulares elegidos funcionenbien juntos. Además, los marcos
proporcionan convenciones que reducen la cantidad de código que un desarrollador
nuevo en el proyecto tiene que comprender: si comprende cómo funciona el
enrutamiento en un proyecto Laravel, por ejemplo, comprende cómo funciona en
todos los proyectos Laravel.
Cuando alguien prescribe implementar su propio marco para cada nuevo proyecto, lo
que realmente está defendiendo es la capacidad de incluir lo que entra y no entra en
la base de su aplicación. Eso significa que los mejores marcos no solo le
proporcionarán una base sólida, sino que también le darán la libertad de personalizar
al contenido de su corazón. Y esto, como te mostraré en el resto de este libro, es
parte de lo que hace que Lara-vel sea tan especial.
Laravel 1, 2 y 3
La primera beta de Laravel 1 fue lanzada en junio de 2011, y fue escrita
completamente desde cero. Presentaba un ORM personalizado (Eloquent);
enrutamiento basado en cierres (inspirado en Ruby Sinatra); un sistema de módulos
para la extensión; y ayudantes para formularios, validación, autenticación y más.
El desarrollo inicial de Laravel se movió rápidamente, y Laravel 2 y 3 fueron
lanzados en noviembre de 2011 y febrero de 2012, respectivamente. Introdujeron
controladores, pruebas unitarias, una herramienta de línea de comandos, un
contenedor de inversión de control (IoC), relaciones elocuentes y migraciones.
Laravel 4
Con Laravel 4, Taylor reescribió todo el marco desde cero. En este punto, Composer,
el ahora omnipresente administrador de paquetes de PHP, estaba mostrando signos
de convertirse en un estándar de la industria, y Taylor vio el valor de reescribir el
marco como una colección de componentes, distribuidos y agrupados por Composer.
Taylor desarrolló un conjunto de componentes bajo el nombre en clave Illuminate y,
en mayo de 2013, lanzó Laravel 4 con una estructura completamente nueva. En
lugar de agrupar la mayor parte de su código como descarga, Laravel ahora sacó la
mayoría de sus componentes de Symfony (otro marco que lanzó sus componentes
para su uso por otros) y los componentes de Illuminate a través de Composer.
Laravel 4 también introdujo queues, un componente de correo, fachadas y siembra de
bases de datos. Y debido a que Laravel ahora confiaba en los componentes de
Symfony, se anunció que Laravel reflejaría (no exactamente, pero poco después) el
calendario de lanzamiento semestral que sigue Symfony.
Laravel 5
Laravel 4.3 estaba programado para lanzarse en noviembre de 2014, pero a medida
que el desarrollo avanzaba, quedó claro que la importancia de sus canalesmerecía un
lanzamiento importante, y Laravel 5 se lanzó en febrero de 2015.
Laravel 5 presentó una estructura de directorios renovada, la eliminación de los
ayudantes de formularios y HTML, la introducción de las interfaces de contrato, una
serie de nuevas vistas, Socialite para la autenticación de redes sociales, Elixir para la
compilación de activos, Scheduler para simplificar cron, dotenv para la gestión
simplificada del entorno, solicitudes de formularios y un nuevo RE PL (bucle de
lectura-evaluación-impresión). Desde entonces ha crecido en características y
madurez, pero no ha habido cambios importantes como en versiones anteriores.
La Comunidad Laravel
Si este libro es su primera exposición a la comunidad Laravel, tiene algo especial
que esperar . Uno de los elementos distintivos de Laravel, que ha contribuido a su
crecimiento y éxito, es la comunidad acogedora y docente que lo rodea. Desde los
tutoriales en video de Laracasts de Jeffrey Way hasta Laravel News, los canales de
Slack e IRC y Discord, desde amigos de Twitter hasta bloggers, podcasts y
conferencias de Laracon, Laravel tiene una comunidad rica y vibrante llena de
personas que han estado presente desde el primer día y las personas que recién están
comenzando su propio "día uno". Y esto no es un accidente:
Desde el principio de Laravel, he tenido la idea de que todas las personas quieren
sentir que son parte de algo. Es un instinto humano natural querer pertenecer y ser
aceptado en un grupo de otras personas de ideas afines. Entonces, al inyectar
personalidad en un marco web y ser realmente activo con la comunidad, ese tipo de
sentimiento puede crecer en la comunidad.
Taylor entendió desde los primeros días de Laravel que un proyecto exitoso de
código abierto necesitaba dos cosas: buena documentación y una comunidad
acogedora. Y esas dos cosas son ahora sellos distintivos de Laravel.
Cómo funciona
Hasta ahora, todo lo que he compartido aquí ha sido completamente abstracto. ¿Qué
pasa con el código, preguntas? Profundicemos en una aplicación simple (Ejemplo 1-
1) para que pueda ver cómo es realmente trabajar con Laravel día a día.
<? ..php
Route::get('/', function () {
});
La acción más simple posible que puede realizar en una aplicación Laravel es definir
una ruta y devolver un resultado cada vez que alguien visita esa ruta. Si inicializa una
nueva aplicación Laravel en su máquina, define la ruta en el Ejemplo 1-1 y luego
sirve el sitio desde el directorio público, tendrá un examen "Hello, World"
completamente funcional
Ejemplo 1-2. "Hello, World" con controladores
Archivo: rutas/web.php
<? ..php
Ruta::get('/', 'WelcomeController@index');
Archivo: app/Http/Controllers/WelcomeController.php
<? ..php
Y si está almacenando sus saludos en una base de datos, también se verá bastante
similar (consulte el Ejemplo 1-3).
Archivo: rutas/web.php
<? ..php
use App\Greeting;
Route::get('create-greeting', function () {
$greeting->save();
});
Route::get('first-greeting', function () {
return Saludo::first()->body;
});
Archivo: app/Saludo.php
<? ..php
utilice Illuminate\Database\Eloquent\Model;
//
<? ..php
use Illuminate\Database\Schema\Blueprint;
usar Illuminate\Database\Migrations\Migration;
$table->bigIncrements('id');
$table->string('cuerpo');
$table->timestamps();
});
Schema::dropIfExists('saludos');
}
}
• PHP >= 7.1.3 para Laravel versiones 5.6 a 5.8, PHP >= 7.0.0 para la versión 5.5, PHP
>= 5.6.4 para la versión 5.4, PHP entre 5.6.4 y 7.1.* para la versión 5.3, o PHP >=
5.5.9 para las versiones 5.2 y 5.1
• Extensión OpenSSL PHP
• Extensión PDO PHP
• Extensión Mbstring PHP
• Tokenizer PHP extension
• Extensión XML PHP (Laravel 5.3 y superior)
• Extensión Ctype PHP (Laravel 5.6 y superior)
• Extensión JSON PHP (Laravel 5.6 y superior)
• Extensión BCMath PHP (Laravel 5.7 y superior)
Compositor
Cualquier máquina en la que esté desarrollando necesitará tener Composer instalado
glob‐ aliado. Si no está familiarizado con Composer, es una herramienta que está en
la base de la mayoría del desarrollo moderno de PHP. Composer es un administrador
de dependencias para PHP, al igual que NPM para Node o RubyGems para Ruby.
Pero al igual que NPM, Composer también es la base de gran parte de nuestras
pruebas, carga de scripts locales, scripts de instalación y mucho más. Necesitará
Composer para instalar Laravel, actualizar Laravel y traer departamentos externos.
Laravel Valet
Si desea utilizar el servidor web incorporado de PHP, su opción más simple es servir
cada sitio desde una URL localhost. Si ejecuta php -S localhost:8000 -t public desde la
carpeta raíz de su sitio Laravel, el servidor web incorporado de PHP servirá a su
sitio en http://local‐ host:8000/. También puede ejecutar php artisan serve una vez que
haya configurado su aplicación para activar fácilmente un servidor equivalente.
Pero si está interesado en vincular cada uno de sus sitios a un dominio de desarrollo
específico, deberá sentirse cómodo con el archivo hosts de su sistema operativo y
usar una herramienta como dnsmasq. En su lugar, intentemos algo más simple.
Si eres un usuario de Mac (también hay bifurcaciones no oficiales para Windows y
Linux), Laravel Valet elimina la necesidad de conectar tus dominios a las carpetas de
tu aplicación. Valet instala dnsmasq y una serie de scripts PHP que permiten
escribir laravel new myapp && abrir myapp.test y que simplemente funcione. Deberá
instalar algunas herramientas con Homebrew, que la documentación lo guiará, pero
los pasos desde la instalación inicial hasta el servicio de sus aplicaciones son
pocos y simples.
Instale Valet (consulte los documentos para obtener lasúltimas instrucciones de
instalación) y apunte a uno o más directorios donde vivirán sus sitios. Dirigí el
servicio de aparcacoches desde mi ~/Sites direc‐ tory, que es donde puse todas mis
aplicaciones en desarrollo. Ahora, puede agregar .test al final del nombre del
directorio y visitarlo en su navegador.
Valet hace que sea fácil servir todas las carpetas en una carpeta determinada como
{foldername}.test usando valet park, servir una sola carpeta usando el enlace
valet, abrir el dominio servido por Valet para una carpeta usando valet open,
servir el sitio Valet con HTTPS usando valet secure y abrir un túnel ngrok para que
pueda compartir su sitio con otros con valet share.
Granja Laravel
Homestead es otra herramienta que tal vez desee utilizar para configurar su entorno
de desarrollo local. Es una herramienta de configuración que se encuentra en la parte
superior de Vagrant (que es una herramienta para administrar máquinas virtuales) y
proporciona una imagen de máquina virtual preconfigurada que estáperfectamente
configurada para el desarrollo de Laravel y refleja el entorno de producción más
común en el que se ejecutan muchos sitios de Laravel. Homestead también es
probablemente el mejor entorno de desarrollo local para desarrolladores que
ejecutan máquinas Windows.
Los documentos de Homestead son robustos y se mantienen constantemente
actualizados, por lo que solo lo referiré a ellos si desea aprender cómo funciona y
cómo configurarlo .
Vaso
No es un proyecto oficial de Laravel, pero Chris Fidao de
Servers for Hackers and Shipping Docker ha creado una
herramienta simple para crear entornos Docker para el desarrollo
de Laravel llamada Vessel. Eche un vistazo a la documentación
del buque para obtener más información.
lambo mi-nuevo-proyecto
. editorconfig
.Env
. env.ejemplo
. gitattributes
. gitignore artisan
composer.jso
n composer.lock
package.json
phpunit.xml
servidor
readme.md.php
webpack.mix.js
Contiene los archivos que el marco Laravel utiliza para arrancar cada vez que se ejecuta.
config
Donde residen todos los archivos de configuración.
base de datos
Donde viven las migraciones de bases de datos, las semillas y las fábricas.
público
El directorio al que apunta el servidor cuando sirve el sitio web. Esto contiene
index.php, que es el controlador frontal que inicia el proceso de arranque y
enruta todas las solicitudes adecuadamente. También es donde van los archivos
públicos como imágenes, hojas de texto, scripts o descargas.
Recursos
Donde residen los archivos que se necesitan para otros scripts. Las vistas, los
archivos de idioma y (opcionalmente) Sass / Less / source CSS y los archivos
JavaScript de origen viven aquí.
Rutas
Donde residen todas las definiciones de ruta, tanto para rutas HTTP como
para "rutas de consola" o comandos Artisan.
almacenamiento
Donde residen las cachés, los registros y los archivos compilados del sistema.
Pruebas
Donde viven las pruebas unitarias y de integración.
vendedor
Dictar las variables de entorno (variables que se espera que sean diferentes en
cada entorno y, por lo tanto, no están comprometidas con el control de
versiones). . env.example es una plantilla que cada entorno debe duplicar para
crear su propio archivo .env, que se ignora en Git.
. gitignore y . gitattributes
Un archivo de configuración para PHPUnit, la herramienta que Laravel utiliza para probar
fuera de la caja.
readme.md
Configuración
La configuración principal de su aplicación Laravel (configuración de conexión de
base de datos, configuración de cola y correo, etc.) se encuentra en archivos en la
carpeta de configuración . Cada uno de estos archivos devuelve una matriz PHP, y
cada valor de la matriz es accesible mediante una clave de configuración que se
compone del nombre de archivo y todas las claves descendientes, separadas por
puntos (. ).
Entonces, si crea un archivo en config/services.php se ve así :
config/services.php
<? ..php
volver [
'sparkpost' => [
],
];
Cualquier variable de configuración que deba ser distinta para cada entorno (y por lo
tanto no confirmada con el control de código fuente) vivirá en sus archivos . env.
Supongamos que desea usar una clave de API de Bugsnag diferente para cada
entorno. Establecería el archivo de configuración para extraerlo de .env:
config/services.php
<? ..php
volver [
'bugsnag' => [
],
];
Esta función auxiliar env() extrae un valor del archivo .env con la misma clave. Así
que ahora, agregue esa clave a su .env (configuración para este entorno) y . Archivos
env.example (placa TEM‐ para todos los entornos):
# En .env
BUGSNAG_API_KEY=oinfp9813410942
# En . env.ejemplo
BUGSNAG_API_KEY=
Su archivo .env ya contendrá bastantes variables específicas del entorno que necesita
el marco, como qué controlador de correo utilizará y cuál es la configuración básica
de la base de datos.
volver [
'bugsnag' => [
],
];
APP_NAME=Lara
vel
APP_ENV=APP_K
EY local=
APP_DEBUG=verdadero
APP_URL=http://localhost
LOG_CHANNEL=pila
DB_CONNECTION=
MySQL
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=granj
a
DB_USERNAME=gran
ja
DB_PASSWORD=secret
o
BROADCAST_DRIVER
=registro
CACHE_DRIVER=arch
ivo
QUEUE_CONNECTION
=sync
SESSION_DRIVER =arc
hivo
SESSION_LIFETIME=1
20
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=
null
REDIS_PORT=6379
MAIL_DRIVER=SMTP
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
AWS_ACCESS_KEY_ID
=
AWS_SECRET_ACCESS
_KEY=
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER
=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="$
{PUSHER_APP_CLUSTER}"
No voy a entrar en todos ellos, porque bastantes son sólo grupos de información
de autenticación para varios servicios (Pusher, Redis, DB, Mail). Sin embargo, aquí
hay dos variables ambientales importantes que debe conocer:
APP_KEY
Una cadena generada aleatoriamente que se usa para cifrar datos. Si alguna vez
está vacío, puede encontrarse con el error "No se ha especificado ninguna
clave de cifrado de aplicación". En ese caso, simplemente ejecute php artisan
key: generate y Laravel generaráuna tasa de genes para usted.
APP_DEBUG
Luego, creo una base de datos con el mismo nombre que mi proyecto en mi cliente
MySQL favorito , y estoy listo para comenzar.
Puesta en marcha
Ahora está listo y funcionando con una instalación de Laravel desnuda. Ejecute git
init, confirme los archivos desnudos con git add . y git commit, y ya estás listo para
empezar a codificar. ¡Eso es todo! Y si está utilizando Valet, puede ejecutar los
siguientes comandos y ver instantáneamente su sitio en vivo en su navegador:
laravel nuevo myProject && cd myProject && valet open
Cada vez que empiezo un nuevo proyecto, estos son los pasos que tomo:
laravel nuevo cd
myProject myProject
git init git
add .
Mantengo todos mis sitios en una carpeta ~/Sites, que he configurado como mi
principal dirección Valet, por lo que en este caso tendría instantáneamente
myProject.test accesible en mi navegador sin trabajo añadido. Puedo editar .env y
apuntarlo a una base de datos en particular, agregar esa base de datos en mi
aplicación MySQL y estoy listo para comenzar a codificar. Y recuerda, si usas
Lambo, todos estos pasos ya están tomados para ti.
Ensayo
En cada capítulo después de esto, la sección "Pruebas" al final del capítulo le
mostrará cómo escribir pruebas para la característica o características que se
cubrieron. Dado que este capítulo no cubre una característica comprobable, hablemos
de las pruebas rápidamente. (Para obtener más información sobre la escritura y
realizando pruebas en Laravel, diríjase al capítulo 12.)
Fuera de la caja, Laravel trae PHPUnit como una dependencia y está configurado
para ejecutar las pruebas en cualquier archivo en el directorio de pruebas cuyo
nombre termina con Test.php (por ejemplo, tests/UserTest.php).
Por lo tanto, lo más sencillopara escribir pruebas es crear un archivo en el directorio
de pruebas con un nombre que termine con Test.php. Y la forma más fácil de
ejecutarlos es ejecutar . /vendor/bin/ phpunit desde la línea de comandos (en la raíz
del proyecto).
Si alguna prueba requiere acceso a la base de datos, asegúrese de ejecutar sus pruebas
desde la máquina donde está alojada su base de datos, por lo que si está alojando su
base de datos en Vagrant, asegúrese de usar ssh en su caja Vagrant para ejecutar sus
pruebas desde allí. Una vez más, puedes aprender sobre esto y mucho más en el
Capítulo 12.
TL;DR
Dado que Laravel es un framework PHP, es muy sencillo servirlo localmente. Laravel
también proporciona dos herramientas para administrar su desarrollo local: una
herramienta más simple llamada Valet que utiliza su máquina local para proporcionar
sus dependencias, y una configuración Vagran t preconfigurada llamada Homestead.
Laravel se basa y puede ser instalado por Composer y viene de la caja con una serie
de carpetas y archivos que reflejan tanto sus convenciones como su relación con
otras herramientas de código abierto.
CAPÍTULO 3
Enrutamiento y controladoress
Lafunción esencial de cualquier marco de aplicación web es tomar solicitudes de un
usuario y entregar respuestas, generalmente a través de HTTP (S). Esto significa
que definir las rutas de una aplicación es el primer y más importante proyecto a
abordar cuando se aprende un marco web; Sin rutas, tiene poca o ninguna capacidad
para interactuar con el usuario final.
En este capítulo examinaremos las rutas en Laravel; verá cómo definirlos, cómo
dirigirlos al código que deben ejecutar y cómo usar las herramientas de enrutamiento
de Laravel para manejar una amplia gama de necesidades de enrutamiento.
¿Qué es MVC ?
En MVC, tiene tres conceptos principales:
modelo
Representa la plantilla que envía los datos al usuario final: piense en "la
plantilla de página de inicio de sesión con este conjunto dado de HTML, CSS y
JavaScript".
controlador
Al igual que un policía de tráfico, toma solicitudes HTTP del navegador, obtiene
los datos correctos de la base de datos y otros mecanismos de almacenamiento,
valida la entrada del usuario y, eventualmente, envía una respuesta al usuario.
En la figura 3-1, puede ver que el usuario final interactuará primero con el
controlador enviando una solicitud HTTP mediante su explorador. El controlador, en
respuesta a esa solicitud, puede escribir datos y/o extraer datos delmodelo (base de
datos). Es probable que el controlador envíe datos a una vista y, a continuación, la
vista se devuelva al usuario final para que la muestre en su navegador.
Cubriremos algunos casos de uso para Laravel que no se ajustan a esta forma
relativamente simplista de ver la arquitectura de aplicaciones, así que no se
obsesione con MVC, pero esto al menos lo preparará para abordar el resto de este
capítulo mientras hablamos de puntos de vista y controles.
Crear un recurso.
PONER
Sobrescribir un recurso.
PARCHE
Modificar un recurso.
BORRAR
Eliminar un recurso.
OPCIONES
¿Qué es REST?
Cubriremos REST con mayor detalle en "The Basics of REST-Like JSON APIs "
en la página 337, pero como breve introducción, es un estilo arquitectónico para
crear API. Cuandohablamos de REST en este libro, haremos referencia
principalmente a algunas características, tales como:
Definiciones de ruta
En una aplicación Laravel, definirá sus rutas web en routes/web.php y sus rutas API
en routes/api.php. Las rutas web son aquellas que serán visitadaspor sus usuarios
finales; Las rutas de API son las de su API, si tiene una. Por ahora, nos centraremos
principalmente en las rutas en rutas/web.php.
La forma más sencilla de definir una ruta es hacer coincidir una ruta (por ejemplo, /)
con un cierre, como se ve en el Ejemplo 3-1.
rutas/web.php
Route::get('/', function () {
});
Ahora ha definido que si alguien visita / (la raíz de su dominio), el enrutador de Laravel
debe ejecutar el cierre definido allí y devolver el resultado.
Una introducción rápida al middleware
Tal vez se pregunte: "¿Por qué estoy devolviendo '¡Hola, mundo!'
en lugar de repetirlo?"
Muchos sitios web simples podrían definirse completamente dentro del archivo de
rutas web. Con unas pocas rutas GET simples combinadas con algunas plantillas,
como se ilustra en el Ejemplo 3-2, puede servir un sitio web clásico fácilmente.
Route::get('/', function () {
vista de retorno ('bienvenido');
});
Route::get('about', function () {
vista de retorno('acerca de');
});
Route::get('products', function () {
vista de retorno ('productos');
});
Route::get('services', function () {
vista de retorno ('servicios');
});
Llamadas estáticas
Si tiene mucha experiencia desarrollando con PHP, es posible que
se sorprenda al ver llamadas estáticas en la clase Route. Esto no es
realmente un método estático per se, sino más bien la ubicación del
servicio utilizando las fachadas de Laravel, que cubriremos en el
Capítulo 11.
$router->get('/', function () {
});
Verbos de ruta
Es posible que hayas notado que hemos estado usando Route::get() en nuestras
definiciones de ruta. Esto significa que le estamos diciendo a Laravel que solo
coincida con estas rutas cuando la solicitud HTTP use la acción GET. Pero, ¿qué pasa
si es un formulario POST, o tal vez algún JavaScript que envía solicitudes PUT o
DELETE? Hay algunas otras opciones para mí para llamar a una definición de
ruta, como se ilustra en el Ejemplo 3-3.
Route::get('/', function () {
});
Route::post('/', function () {
});
Route::put('/', function () {
});
Route::delete('/', function () {
});
Route::any('/', function () {
});
});
Manejo de rutas
Como probablemente hayas adivinado, pasar un cierre a la definición de ruta no es la
única forma de enseñarle cómo resolver una ruta. Los cierres son rápidos y simples,
pero cuanto más grande es su aplicación, más torpe se vuelve poner toda su lógica de
enrutamiento enun archivo. Además, las aplicaciones que usan cierres de ruta no
pueden aprovechar el almacenamiento en caché de rutas de Laravel (más sobre esto
más adelante), que puede reducir hasta cientos de milisegundos de cada solicitud.
La otra opción común es pasar un nombre y un método de controlador como una
cadena en lugar del cierre, como en el ejemplo 3-4.
Ruta::get('/', 'WelcomeController@index');
Esto le está diciendo a Laravel que pase las solicitudes a esa ruta al método index()
del controlador App\Http\Controllers\WelcomeController. A este método se le pasarán
los mismos parámetros y se tratará de la misma manera que un cierre que podría
haber colocado alternativamente en su lugar.
Parámetros de ruta
Si la ruta que está definiendo tiene parámetros (segmentos en la estructura de URL
que son variables), es fácil definirlos en su ruta y pasarlos a su cierre (consulte el
Ejemplo 3-5).
También puede hacer que los parámetros de su ruta sean opcionales incluyendo un
signo de interrogación (? ) después del nombre del parámetro, como se ilustra en el
ejemplo 3-6. En este caso, también debe proporcionar un valor predeterminado para
la variable correspondiente de la ruta.
//
});
Y puede usar expresiones regulares (regexes) para definir que una ruta solo debe
coincidir si un parámetro cumple requisitos particulares, como en el ejemplo 3-7.
//
})->donde('id', '[0-9]+');
//
//
Como probablemente haya adivinado, si visita una ruta que coincide con una cadena
de ruta pero el regex no coincide con el parámetro, no se comparará. Dado que las
rutas se emparejan de arriba a abajo, los usuarios/abc omitirían el primer cierre en el
Ejemplo 3-7, pero se emparejaría con el segundo cierre, por lo que se enrutaría allí.
Por otro lado, posts/abc/123 no coincidiría con ninguno de los cierres, por lo que
devolvería un error 404 (No encontrado).
A menos que esté usando el enlace de modelo de ruta, que se describe más
adelante en este capítulo, no. Lo único que define qué parámetro de ruta
coincide con qué parámetro de método es su orden (de izquierda un derecha), como
Nombres R oute
La forma más sencilla de hacer referencia a estas rutas en otras partes de la
aplicación es simplemente por su ruta. Hay un ayudante global url() para simplificar
ese enlace en sus vistas, si lo necesita; consulte el Ejemplo 3-8 para ver un ejemplo. El
ayudante prefijará su ruta con el dominio completo de su sitio.
Sin embargo, Laravel también le permite nombrar cada ruta, lo que le permite
referirse a ella sin hacer referencia explícita a la URL. Esto es útil porque significa
que puede dar apodos simples a rutas complejas, y también porque vincularlos por
nombre significa que no tiene que reescribir sus enlaces de interfaz si las rutas
cambian (consulte el Ejemplo 3-9).
Route::get('members/{id}', 'MembersController@show')->name('members.show');
Route::get('members/{id}',
[ 'as' => 'members.show',
'usos' => 'MembersController@show',
]);
En nuestro ejemplo, hemos llamado a esta ruta members.show; resourcePlural.
acción es una convención común dentro de Laravel para la ruta y el nombrede
vista s.
En este ejemplo también se introdujo el ayudante route(). Al igual que url(), está
diseñado para usarse en vistas para simplificar la vinculación a una ruta con
nombre. Si la ruta no tiene parámetros, simplemente puede pasar el nombre de la
ruta (route('members.index')) y recibir una cadena de ruta
(http://myapp.com/members). Si tiene parámetros, páselos como una matriz como el
segundo parámetro como hicimos en el Ejemplo 3-9.
En general, recomiendo usar nombres de ruta en lugar de rutass para referirse a sus
rutas y, por lo tanto, usar el ayudante route() en lugar del ayudante url(). A veces
puede ser un poco torpe, por ejemplo, si está trabajando con varios subdominios,
pero proporciona un nivel increíble de flexibilidad para cambiar posteriormente la
estructura de enrutamiento de la aplicación sin mayor penalización.
Route Grupos
A menudo, un grupo de rutas comparte una característica particular: un determinado
requisito de autenticación, un prefijo de ruta de acceso o tal vez un espacio de
nombres de controlador. Definir estas características compartidas una y otra vez en
cada ruta no solo parece tedioso, sino que también puede enturbiar la forma de su
archivo de rutas y oscurecer algunas de las estructuras de su aplicación.
Los grupos de rutas le permiten agrupar varias rutas y aplicar cualquier
configuración de configuración compartida una vez a todo el grupo, para reducir esta
duplicación. Además, los grupos de rutas son señales visuales para los futuros
desarrolladores (y para su propio cerebro) de que estas rutas están agrupadas.
Para agrupar dos o más rutas, "rodee" las definiciones de ruta con un grupo de rutas,
como se muestra en el ejemplo 3-10. En realidad , en realidad está pasando un
cierre a la definición de grupo y definiendo las rutas agrupadas dentro de ese cierre.
Route::group(function () { Route::get('hello',
function () {
});
Route::get('world', function () {
});
});
Ejemplo 3-11. Restringir un grupo de rutas solo a usuarios que han iniciado sesión
Route::middleware('auth')->group(function() {
Route::get('dashboard', function () {
return view('dashboard');
});
Route::get('account', function () {
return view('cuenta');
});
});
return view('dashboard');
});
Route::get('account', function () {
return view('cuenta');
});
});
$this->middleware('auth');
$this->middleware('admin-auth')
->only('editUsers');
->excepto('editUsers');
Limitación de velocidad
Si necesita limitar a los usuarios para que solo accedan a cualquier ruta determinada
un cierto número de veces en un período de tiempo determinado (llamado limitación
de velocidad, y más común con las API), hay un middleware listo para usar para eso
en la versión 5.2 y superior. Aplique el acelerador middleware, que toma dos
parámetros: el primero es el número de intentos permitidos a un usuario y el segundo
es el número de minutos que se deben esperar antes de restablecer el recuento de
intentos. El ejemplo 3-12 demdescribe su uso.
Ejemplo 3-12. Aplicación del middleware limitante de velocidad a una ruta
//
});
});
Route::prefix('dashboard')->group(function () {
Route::get('/', function () {
});
Route::get('users', function () {
});
});
Tenga en cuenta que cada grupo con prefijo también tiene una ruta / que representa la raíz del
prefijo
: en el ejemplo 3-13 eso es /dashboard.
Rutas de reserva
En Laravel antes de 5.6, podía definir una "ruta de reserva" (que debe definir
al final del archivo de rutas) para capturar todas las rutas no coincidentes:
Route::any('{anything}', 'CatchAllController')->where('anything', '*');En Laravel 5.6+, puedes usar el
método Route::fallback() en su lugar:
Route::fallback(function () {
//
});
Enrutamiento de subdominios
El enrutamiento de subdominio es lo mismo que el prefijo de ruta, pero se define por
subdominio en lugar de prefijo de ruta. Hay dos usos principales para esto. En primer
lugar, es posible que desee presentar diferentes secciones de la aplicación (o
aplicaciones completamente diferentes) a diferentes subdominios. El ejemplo 3-14
muestra cómo puede lograr esto.
Route::domain('api.myapp.com')->group(function () {
Route::get('/', function () {
//
});
});
En segundo lugar, es posible que desee establecer parte del subdominio como
parámetro, como se ilustra en el ejemplo 3-15. Esto se hace con mayor frecuencia en
casos de multitenencia (piense en Slack o Har-vest, donde cada compcualquiera
obtiene su propio subdominio, como tighten.slack.co).
Route::domain('{account}.myapp.com')->group(function () {
Route::get('/', function ($account) {
//
});
//
});
});
Tenga en cuenta que cualquier parámetro para el grupo se pasa a los métodos de las
rutas agrupadas como los primeros parámetros.
// App\Http\Controllers\UsersController
Ruta::get('/', 'UsersController@index');
route::namespace('Dashboard')->group(function () {
App\Http\Controllers\Dashboard\PurchasesController
Ruta::get('dashboard/purchases', 'PurchasesController@index');
});
Prefijos de nombre
Los prefijos no se detienen ahí. Es común que los nombres de ruta reflejen la
cadena inherente de elementos de ruta, por lo que users/comments/5 serán atendidos
por una ruta llamada users.comments.show. En este caso, es común usar un grupo de
rutas alrededor de todas las rutas que están debajo del recurso users.comments.
Al igual que podemos prefijar segmentos de URL y espacios de nombres de
controlador, también podemos prefijar cadenas al nombre de la ruta. Con route group
name prefixes, podemos definir que cada ruta dentro de este grupo debe tener una
cadena dada con el prefijo de su nombre. En este texto, estamos anteponiendo
"usuarios". a cada nombre de ruta, luego "comentarios". (ver Ejemplo 3-17).
Route::name('usuarios'. )->prefix('users')->group(function ()
{ Route::name('comments.' )->prefix('comments')->group(function () {
Route::get('{id}', function () {
})->name('mostrar');
});
});
Rutas firmadas
Muchas aplicaciones envían regularmente notificaciones sobre acciones únicas
(restablecer una palabra de contraseña, aceptar una invitación, etc.) y proporcionan
enlaces simples para realizar esas acciones. Imaginemos enviar un correo
electrónico confirmando que el destinatario estaba dispuesto a ser agregado a una
lista de correo.
Hay tres formas de enviar ese enlace:
1. Haga pública esa URL y espere que nadie más descubra la URL de
aprobación o modifique su propia URL de aprobación para aprobar a otra
persona.
Una forma sencilla de lograr la última opción es usar una función introducida en Laravel.
5.6.12 llamadas URL firmadas, lo que facilita la creación de un sistema de
autenticación de firma para enviar enlaces autenticados. Estos enlaces están
compuestos por el enlace de ruta normal con una "firma" adjunta que demuestra
que la URL no se ha cambiado desde que se envió (y por lo tanto que nadie ha
modificado la URL para acceder a la URL de otra persona). información).
Controladores
He mencionado controladores varias veces, pero hasta ahora la mayoría de los
ejemplos han mostrado cierres de ruta. En el patrón MVC, los controladores son
esencialmente clases que organizan la lógica de una o más rutas juntas en un solo
lugar. Los controladores tienden a agrupar rutas similares, especialmente si su
aplicación está estructurada en un formato tradicional similar a CRUD; en este caso,
un controlador puede manejar todas las acciones que se pueden realizar en un
recurso en particular.
¿Qué es CRUD?
CRUD significa creare, leer, actualizar, eliminar, que son
las cuatro operaciones principales que las aplicaciones web
proporcionan más comúnmente en un recurso. Por ejemplo, puede
crear una nueva entrada de blog , puede leer esa publicación,
puede actualizarla o puede eliminarla.
Puede ser tentador meter toda la lógica de la aplicación en los controladores, pero es
mejor pensar en los controladores como los policías de tráfico que enrutan las
solicitudes HTTP alrededor de su aplicación. Dado que hay otras formas en que las
solicitudes pueden entrar en su aplicación
(trabajos cron, llamadas de línea de comandos de Artisan, trabajos de cola, etc.), es
aconsejable no depender de los controladores para mucho comportamiento. Esto
significa que el trabajo principal de un controlador es capturar la intención de una
solicitud HTTP y pasarla al resto de la aplicación.
Obtener la opinión del usuario
La segunda acción más común a realizar en un método de controlador es tomar
información del usuario y actuar sobre ella. Eso introduce algunos conceptos
nuevos, así que echemos un vistazo a un poco de código de muestra y veamos las
nuevas piezas.
Primero, unamos nuestra ruta; véase el ejemplo 3-25.
rutas/web.php
Route::get('tasks/create', 'TasksController@create');
Route::post('tasks', 'TasksController@store');
Tenga en cuenta que estamos enlazando la acción GET de tasks/create (que muestra
un formulario para crear una nueva tarea) y la acción POST de tasks/ (que es donde
nuestro formulario PUBLICARÁ cuando estemos creando una nueva tarea ).
Podemos asumir que el método create() en nuestro controlador solo muestra un
formulario, así que veamos el método store() en el Ejemplo 3-26.
TasksController.php
...
Tarea::create(request()->only(['title', 'description']));
return redirect('tareas');
Devuelve:
'title' => 'Cualquiera que sea el título que el usuario escribió en la página anterior', 'description'
=> 'Cualquier descripción que el usuario haya escrito en la página anterior',
Y Task::create() toma una matriz asociativa y crea una nueva tarea a partir de ella:
Tarea::create([
]);
Al combinarlos, se crea una tarea con solo los campos "título" y "descripción"
proporcionados por el usuario.
Como buen ejemplo, ¿qué sucede si prefiere tener una instancia del objeto Request
en lugar de usar el ayudante global? Simplemente escriba Illuminate\ Http\Request en
los parámetros del método, como en el ejemplo 3-27.
TasksController.php
...
Tarea::create($request->only(['title', 'description']));
return redirect('tareas');
Por lo tanto, ha definido un parámetro que debe pasarse al método store(). Y como
lo escribiste, y dado que Laravel sabe cómo resolver ese nombre de clase, tendrás el
objeto Request listo para que lo uses en tu método sin trabajo de tu parte. Sin enlace
explícito, nada más, solo está ahí como el
$request variable.
Plantillas de cuchillas
Como puede ver, Blade usa llaves para su "eco" e introduce una convención en la
que sus etiquetas personalizadas, llamadas "directivas", tienen el prefijo @. Usará
directivas para todas sus estructuras de control y también para la herencia y
cualquier funcionalidad personalizada que desee agregar.
La sintaxis de Blade es limpia y concisa, por lo que en su núcleo es más agradable y
ordenado trabajar con ella que con las alternativas. Pero en el momento en que
necesite cualquiercosa de cualquier complejidad en sus plantillas (herencia anidada,
condicionales complejos o recursión), Blade
comienza a brillar realmente. Al igual que los mejores componentes Laravel, toma
requisitos de aplicación complejos y los hace fáciles y accesibles.
Además, dado que toda la sintaxis de Blade se compila en código PHP normal y
luego se almacena en caché, es rápido y le permite usar PHP nativo en sus archivos
Blade si lo desea. Sin embargo , recomendaría evitar el uso de PHP si es posible;
por lo general, si necesita hacer algo que no puede hacer con Blade o una directiva
Blade personalizada, no pertenece a la plantilla.
Eco de datos
Como puede ver en el Ejemplo 4-1, {{ y }} se usan para envolver secciones de
PHP que le gustaría repetir. {{ $variable }} es similar a <?= $variable ?> en PHP
simple.
Sin embargo, es diferente de una manera, y es posible que ya lo haya adivinado:
Blade escapa de todos los ecos de forma predeterminada utilizando htmlentities() de PHP
para proteger a sus usuarios de la inserción de scripts maliciosos. Eso significa que { {
$variable }} es funcionalmente equivalente a
<?= htmlentities($variable) ?>. Si quieres hacer eco sin el escape, usa {!!
Blade ignorará cualquier {{ que esté precedido por una @. Por lo tanto, analizará el
primero de los siguientes ejemplos, pero el segundo se repetirá directamente:
analizado como cuchilla; el valor de $bladeVariable se repite en la vista
{{ $bladeVariable }}
@{{ manillarVariable }}
Control Estructuras
La mayoría de las estructuras de control en Blade serán muy familiares. Muchos se
hacen eco directamente del nombre y la estructura de la misma etiqueta en PHP.
Hay algunos ayudantes de conveniencia, pero en general, las estructuras de control se
ven más limpias de lo que lo harían en PHP.
Condicionales
Primero, echemos un vistazo a las estructuras de control que permiten la lógica.
@if
¿El @if de Blade ($condition) compila para <? php if ($condition): ? >. @else, @elseif
y @endif también compilan exactamente el mismo estilo de sintaxis en PHP. Eche un
vistazo al Ejemplo 4-2 para ver algunos ejemplos.
Al igual que con los condicionales nativos de PHP, puede mezclarlos y combinarlos
como desee. No tienen ninguna lógica especial; hay literalmente un analizador que busca
algo con la forma de @if ($condition) y lo reemplaza con el código PHP apropiado.
@unless y @endunless
@unless, por otro lado, es una nueva sintaxis que no tiene un equivalente directo en
PHP. Es el inverso directo de @if. @a menos que ($condition) sea lo mismo que <?
php if (!
@unless ($user->hasPaid())
Puede completar su pago cambiando a la pestaña de pago. @endunless
Bucles
A continuación, echemos un vistazo a los bucles.
@for, @foreach y @while
@for, @foreach y @while funcionan igual en Blade que en PHP; véanse los ejemplos
4-4, 4-5 y 4-6.
@endfor
@forelse y @endforelse
@forelse es un @foreach que también le permite programar en una reserva si el
objeto sobre el que está iterando está vacío. Lo vimos en acción al comienzo de este
capítulo; El ejemplo 4-7 muestra otro ejemplo.
iteración
restante
contar
último
Cuántos "niveles" de profundidad tiene este bucle : 1 para un bucle, 2 para un bucle dentro
de un bucle, etc.
padre
Una referencia a la variable $loop para el elemento de bucle primario si este bucle
está dentro de otro bucle @foreach; de lo contrario, null
<ul>
@foreach ($page->children() como $child)
<li>{{ $loop->parent->iteration }}
. {{ $loop->iteración }}:
{{ $child->title }} </li>
@endforeach
</ul>
@endif
</li>
@endforeach
</ul>
Herencia de plantillas
Blade proporciona una estructura para la herencia de plantillas que permite que las
vistas se extiendan, modifiquen e incluyan otras vistas.
Echemos un vistazo a cómo se estructura la herencia con Blade.
<html>
<cabeza>
</cabeza>
<cuerpo>
<div class="container">
@yield('content')
</div>
@section('footerScripts')
<script src="app.js"></script>
@show
</cuerpo>
</html>
Esto se parece un poco a una página HTML normal, pero puedes ver que hemos
cedido en dos lugares (título y contenido) y hemos definido una sección en un tercero
(footerScripts ). Tenemos tres directivas de Blade aquí: @yield ('content') solo,
@yield('title', ' Home Page') con un valor predeterminado definido y
@section/@show con contenido real.
Si bien cada uno se ve un poco diferente, los tres funcionan esencialmente igual.
Los tres están definiendo que hay una sección con un nombre dado (el primer
parámetro) que se puede extender más tarde, y los tres están definiendo qué hacer si
la sección no se extiende. Lo hacen proporcionando una reserva de cadena (' Página
de inicio'), sin reserva (que simplemente no mostrará nada si no se extiende), o una
reserva de bloque completo (en este caso,
<script src="app.js"></script>).
Una vez que tenga un diseño principal como este, puede extenderlo en un nuevo
archivo de plantilla como en el Ejemplo 4-9.
@extends('layouts.master')
@section('title', 'Dashboard')
@section('contenido')
@section('footerScripts')
@parent
<script src="dashboard.js"></script>
@endsection
Esta vista infantil nos permite cubrir algunos conceptos nuevos en la herencia de Blade.
@extiende
En el ejemplo 4-9, con @extends('layouts.master')), definimos que esta vista no debe
representarse por sí sola, sino que amplía otra vista. Eso significa que su papel es
definir el contenido de varias secciones, pero no permanecer en una. Es casi más
como una serie de cubos de contenido, en lugar de una página HTML. Esta línea
también define que la vista está extendiendo vidas en
resources/views/layouts/master.blade.php.
Cada archivo solo debe extender otro archivo y la llamada @extends debe ser la
primera línea del archivo.
@section y @endsection
Con @section('title', 'Dashboard'), proporcionamos nuestro contenido para la primera
sección, título. Dado que el contenido es tan corto, en lugar de usar @section y @end
sección, solo estamos usando un acceso directo. Esto nos permite pasar el contenido
como el second de @section y luego continuar. Si es un poco desconcertante de
ver
@section sin @endsection, podrías usar la sintaxis normal.
@padre
Finalmente, con @section('footerScripts') y activado, usamos la sintaxis normal
para definir el contenido de la sección footerScripts.
Pero recuerde, en realidad definimos ese contenido (o, al menos, su
"predeterminado") ya en el diseño maestro. Así que esta vez , tenemos dos
opciones: podemos sobrescribir el contenido desde la vista principal, o podemos
agregarle algo.
Puede ver que tenemos la opción deincluir el contenido del padre utilizando la
directiva @parent dentro de la sección. Si no lo hiciéramos, el contenido de esta
sección sobrescribiría completamente cualquier cosa definida en el padre para esta
sección.
@incluir
¿Qué pasa si estamos en una vista y queremos atraer otra vista? Tal vez tengamos un
botón de llamada a la acción "Registrarse" que queremos reutilizar en el sitio. Y tal
vez queramos personalizar el texto del botón cada vez que lo usamos . Eche un
vistazo al ejemplo 4-10.
<p>He aquí por qué deberías registrarte en nuestra aplicación: <strong>It's Great. </fuerte></p>
</div>
</a>
@include extrae el parcial y, opcionalmente, pasa datos en él. Tenga en cuenta que no
solo puede pasar datos explícitamente a un include a través del segundo parámetro
de @include, sino que también puede hacer referencia a cualquier variable dentro del
archivo incluido que esté disponible para la vista de inclusión ( $pageName, en este
ejemplo). Una vez más, puede hacer lo que quiera, pero recomendaría que considere
siempre pasar explícitamente cada variable que pretenda usar, solo para mayor
claridad.
También se utilizan las directivas @includeIf, @includeWhen y @includeFirst, como se
muestra en el ejemplo 4-11.
{{-- Incluir una vista si una variable pasada es truth-y --}} @includeWhen($user-
>isAdmin(), 'sidebars.admin', ['some' => 'data'])
{{-- Incluir la primera vista que existe de una matriz dada de vistas --}}
@includeFirst(['customs.header', 'header'], ['some' => 'data'])
@cada uno
Probablemente pueda imaginar algunas circunstancias en las que necesitaría
recorrer una matriz o colección y @include un parcial para cada elemento. Hay una
directiva para eso: @each.
Digamos que tenemos una barra lateral compuesta de módulos, y queremos incluir
varios módulos, cada uno con un título diferente. Eche un vistazo al ejemplo 4-12.
<div class="sidebar">
<div class="sidebar-module">
</div>
<!-- resources/views/partials/empty-module.blade.php -->
<div class="sidebar-module"> No
hay módulos :(
</div>
Uso de pilas
Un patrón común que puede ser difícil de administrar utilizando B lade incluye
básico es cuando cada vista en una jerarquía de inclusión de Blade necesita agregar
algo a una determinada sección, casi como agregar una entrada a una matriz.
La situación más común para esto es cuando ciertas páginas (y a veces, más
ampliamente, ciertas secciones de un sitio web) tienen archivos CSS y JavaScript
únicos específicos que necesitan cargar. Imagine que tiene un archivo CSS "global"
para todo el sitio, un archivo CSS de " sección de trabajos" y un archivo CSS de
página de "solicitar un trabajo".
Las pilas de Blade están diseñadas exactamente para esta situación. En la plantilla
principal, defina una pila, que es solo un marcador de posición. Luego, en cada
plantilla secundaria puede "empujar" entradas en esa pila con @push / @endpush,
que las agrega a la parte inferior de la pila en el renderizado final. También puede
usar @prepend/@endprepend para agregarlos a la parte superior de la pila. Ejemplo
4-13 iilustra.
<html>
<script src="/css/global.css"></script>
@stack('scripts')
</cuerpo>
</html>
@extends('layouts.app')
@push('scripts')
@extends('jobs')
@prepend('scripts')
<script src="/css/global.css"></script>
<script src="/css/jobs--apply.css"></script>
<script src="/css/jobs.css"></script>
</cuerpo>
</html>
<div class="modal">
</div>
@include('partials.modal', [
'body' => '<p>La contraseña que ha proporcionado no es válida. Aquí están las reglas para
contraseñas válidas: [...] </p><p><a href="#">... </a></p>'
])
<div class="modal">
</div>
@component('parcials.modal')
Múltiples ranuras
El método que utilizamos en el Ejemplo 4-15 se denomina ranura "predeterminada";
Lo que pase entre @component y @endcomponent se pasa a la variable $slot. Pero
también puede tener algo más que la ranura predeterminada. Imaginemos un modal
con un título, como en el ejemplo 4-16.
<div class="modal">
</div>
Puede utilizar la directiva @slot en las llamadas @component para pasar contenido
a ranuras distintas de la predeterminada, como puede ver en el ejemplo 4-17.
@component('parcials.modal')
@slot('título')
...
@endcomponent
AppServiceProvider@boot
Blade::component('partials.modal', 'modal');
@modal
Puede definir una plantilla principal y dejar "agujeros" en ella para el contenido
utilizando @yield y @section/@show. A continuación, puede enseñar a sus vistas
secundarias a extenderlas usando @extends('parent.view'), y definir sus secciones
usando @section/@endsection. Utilice @parent para hacer referencia al contenido
del elemento primario del bloque.
Los compositores de vistas facilitan la definición de que, cada vez que se carga una
vista o subvista en particular , debe tener cierta información disponible. Y la
inyección de servicios permite que la propia vista solicite datos directamente desde
el contenedor de la aplicación
CHAPTER 5
Configuración
Antes de entrar en cómo usar las herramientas de base de datos de Laravel ,
hagamos una pausa por un segundo y repasemos cómo configurar las credenciales
y conexiones de su base de datos.
La configuración para el acceso a la base de datos reside en config/database.php
y .env. Al igual que muchas otras áreas de configuración en Laravel, puede definir
múltiples "conexiones" y luego decidir cuál será el código que usará de forma
predeterminada.
Conexiones de base de datos
De forma predeterminada, hay una conexión para cada uno de los controladores,
como puede ver en el Ejemplo 5-1.
'conexiones' =>
[ 'sqlite' => [
'mysql' => [
'pgsql' => [
],
'sqlsrv' => [
],
Nada le impide eliminar o modificar estas conexiones nombradas o crear las suyas
propias. Puede crear nuevas conexiones con nombre y podrá establecer los
controladores (MySQL, Postgres, etc.) en ellas. Entonces, si bien hay una conexión
por controlador de forma predeterminada, eso no es una restricción; podría tener
cinco conexiones diferentes, todas con el controlador mysql, si lo desea.
Cada conexión le permite definir las propiedades necesarias para conectarse y
personalizar cada tipo de conexión.
Hay algunas razones para la idea de múltiples conductores. Para empezar, la sección
"conexiones", tal como viene de la caja, es una plantilla simple que facilita el
inicio de aplicaciones que utilizan cualquiera de los tipos de conexión de base de
datos compatibles. En muchas aplicaciones, puede elegir la conexión de base de
datos que usará, completar su información e incluso eliminar las demás si lo desea.
Por lo general, los mantengo todos allí, en caso de que eventualmente pueda usarlos.
Pero también hay algunos casos en los que puede necesitar múltiples
conexionesdentro de la misma aplicación. Por ejemplo, puede usar diferentes
conexiones de base de datos para dos tipos diferentes de datos, o puede leer de uno y
escribir en otro. El soporte para múltiples conexiones lo hace posible.
Otras opcionesde configuración de bases de datos
La sección de configuración config/database.php tiene bastantes otras opciones de
configuración. Puede configurar el acceso a Redis, personalizar el nombre de la tabla
utilizada para las migraciones, determinar la conexión predeterminada y alternar si
las llamadas no elocuentes return stdClass o instancias de matriz.
Con cualquier servicio en Laravel que permita conexiones desde múltiples fuentes
(las sesiones pueden estar respaldadas por la base de datos o el almacenamiento de
archivos, la caché puede usar Redis o Memcached, las bases de datos pueden usar
MySQL o PostgreSQL), puede definir múltiples conexiones y También elija que
una conexión en particular será la "predeterminada", lo que significa que se usará
cada vez que no solicite explícitamente una conexión en particular. Así es como
solicita una conexión específica, si lo desea:
$users = DB::connection('secondary')->select('select * from users');
Definición de migraciones
Una migración es un único archivo que define dos cosas: las modificaciones
deseadas al ejecutar esta migración y, opcionalmente, las modificaciones deseadas
al ejecutar esta migración .
use Illuminate\Database\Schema\Blueprint;
usar Illuminate\Database\Migrations\Migration;
/**
* @return void
*/
$table->bigIncrements('id');
$table->string('nombre');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('contraseña');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Revertir las migraciones.
*
* @return void
*/
función pública down()
{
Schema::dropIfExists('users');
}
Como puede ver, tenemos un método up( ) y un método down(). up() le dice a la
migración que cree una nueva tabla llamada users con unos pocos campos, y down()
le dice que elimine la tabla users.
rellena previamente la migración con código diseñado para crear una tabla denominada
table_name, y
--table=table_name solo rellena previamente la migración para modificaciones a una
tabla existente. Estos son algunos ejemplos:
php artisan make:migración create_users_table
Creación de tablas
Ya vimos en la migración de create_users_table predeterminada que nuestras
migraciones dependen de la fachada Schema y sus métodos. Todo lo que podamos
hacer en estas migraciones dependerá de los métodos de Schema.
Para crear una nueva tabla en una migración, utilice el método create(): el primer
parámetro es el nombre de la tabla y el segundo es un cierre que define sus
columnas:
Schema::create('users', function (Blueprint $table) {
});
Creación de columnas
Para crear nuevas columnas en una tabla, ya sea en una llamada de creación de tabla
o en una llamada de tabla de modificación, use la instancia de Blueprint que se ha
pasado al cierre:
Schema::create('users', function (Blueprint $table) {
$table->string('nombre');
});
json(colName) y jsonb(colName)
Agrega una columna JSON o JSONB (o una columna TEXT en Laravel 5.1)
timestamps() y nullableTimestamps()
$table->string('email')->nullable()->after('last_name');
});
Marca las columnas enteras como sin signo (no negativas ni positivas, sino solo un entero)
first() (sólo MySQL)
primario()
Eliminación de tablas
Si desea eliminar una tabla, hay un método dropIfExists() en Schema que toma un
parámetro, el nombre de la tabla:
Schema::dropIfExists('contacts');
Modificación de columnas
Para modificar una columna, simplemente escriba el código que escribiría para
crear la columna como si fuera nueva, y luego agregue una llamada al método
change() después de ella.
Entonces , si tenemos una columna de cadena llamada name que tiene una longitud
de 255 y queremos cambiar su longitud a 100, así es como la escribiríamos :
Schema::table('users', function (Blueprint $table) {
$table->string('name', 100)->change();
});
$table->string('deleted_at')->nullable()->change();
});
$table->renameColumn('promoted', 'is_promoted');
});
$table->dropColumn('votes');
});
$table->dropColumn('is_promoted');
});
$table->dropColumn('alternate_email');
});
}
Índices y claves externas
Hemos cubierto cómo crear, modificar y eliminar columnas. Pasemos a indexarlos
y relacionarlos.
Si no está familiarizado con los índices, sus bases de datos pueden sobrevivir si
nunca las usa, pero son muy importantes para la optimización del rendimiento y para
algunos controles de integridad de datos con respecto a las tablas relacionadas.
Recomendaría leer sobre ellos, pero si es absolutamente necesario, puede omitir esta
sección por ahora.
Agregar índices. Consulte el Ejemplo 5-3 para ver ejemplosde cómo agregar índices a su
columna.
$table->dropPrimary('contacts_id_primary');
$table->dropUnique('contacts_email_unique');
$table->dropIndex('optional_custom_index_name');
$table->dropIndex(['email', 'amount']);
Agregar y quitar claves externas. Para agregar una clave externa que defina que una
columna determinada hace referencia a una columna de otra tabla, la sintaxis de
Laravel es simple y clara:
$table->foreign('user_id')->references('id')->on('users');
->referencias('id')
->on('usuarios')
->onDelete('cascada');
Para eliminar una clave externa, podemos eliminarla haciendo referencia a su nombre
de índice (que se genera automáticamente combinando los nombres de las columnas
y tablas que se están ref‐ erenced):
$table->dropForeign('contacts_user_id_foreign');
o pasándole una matriz de los campos a los que hace referencia en la tabla local:
$table->dropForeign(['user_id']);
Ejecución de migraciones
Una vez que haya definido sus migraciones, ¿cómo las ejecuta? Hay un comando
Artisan para eso:
php artisan migrate
Este comando ejecuta todas las migraciones "pendientes" (ejecutando el método up()
en cada una). Laravel realiza un seguimiento de las migraciones que ha ejecutado y
cuáles no. Cada vez que ejecuta este comando, comprueba si ha ejecutado todas las
migraciones disponibles y, si no lo ha hecho, ejecutará las que queden.
Hay algunas opciones en este espacio de nombrescon las que puede trabajar.
Primero, puede ejecutar sus migraciones y sus semillas (que cubriremos a
continuación):
php artisan migrate --seed
Revierte todas las migraciones de bases de datos que haya ejecutado en esta instancia.
migrar:actualizar
migrar:fresco
Revierte solo las migraciones que se ejecutaron la última vez que ejecutó
migrate o, con la opción agregada --step=n, revierte el número de migraciones
que especifique.
migrar:estado
Muestra una tabla que enumera cada migración, con una Y o N junto a cada
una que muestra si se ha ejecutado o no en este entorno.
Siembra
Sembrar con Laravel es tan simple que ha ganado una adopción generalizada como
parte de los flujos de trabajo de desarrollo nor‐ mal de una manera que no lo ha
hecho en los marcos PHP anteriores. Hay una carpeta database/seeds que viene
con una clase DatabaseSeeder, que tiene un método run() al que se llama cuando se
llama al seeder.
Hay dos formas principales de ejecutar las sembradoras: junto con una migración o
por separado. Para ejecutar un seeder junto con una migración , simplemente
agregue --seed a cualquier llamada de migración:
php artisan migrate --seed
php artisan migrate:refresh --seed
base de datos/semillas/DatabaseSeeder.php
...
$this->call(ContactsTableSeeder::class);
Ahora vamos a editar la sembradora en sí. Lo más simple que podemos hacer allí es
insertar manualmente un registro usando la fachada de la base de datos, como se
ilustra en el Ejemplo 5-6.
utilice Illuminate\Database\Seeder;
utilice Illuminate\Database\Eloquent\Model;
]);
Esto nos dará un solo disco, lo cual es un buen comienzo. Pero para semillas
verdaderamente funcionales, es probable que desee hacer un bucle sobre algún tipo
de generador aleatorio y ejecutar este inserto () muchas veces, ¿verdad? Laravel tiene
una característica para eso.
Fábricas Modelo
Las fábricas de modelos definen uno (o más) patrones para crear entradas falsas para
sus tablas base de datos . De forma predeterminada, cada fábrica lleva el nombre
de una clase Eloquent , pero también puede nombrarlas después de la tabla si no
va a trabajar con Eloquent. El ejemplo 5-7 muestra la misma configuración de
fábrica en ambos sentidos.
Example 5-7. Definición de fábricas de modelos con claves de nombre de tabla y
clase Eloquent
volver [
];
});
volver [
'nombre' => $faker->nombre,
];
});
Teóricamente, puedes nombrar estas fábricas como quieras, pero nombrar la fábrica
después de tu clase elocuente es el enfoque más idiomático.
Para generar una nueva clase de fábrica, use el comando Artisan make:factory; al
igual que con la nomenclatura de las claves de fábrica , también es más común
nombrar las clases de fábrica después de los modelos Eloquent de los que están
destinadas a generar instancias de:
php artisan make:factory ContactFactory
Esto generará un nuevo archivo dentro del directorio de bases de datos/fábricas llamado
ContactFac‐ tory.php. La fábrica más simple que podríamos definir para un contacto
podría verse algo como el Ejemplo 5-8:
volver [
});
Ahora podemos usar el ayudante global factory() para crear una instancia de Contact
en nuestra siembra y prueba:
Crear uno
$contact = factory(Contact::class)->create();
Crear muchos
factory(Contacto::class, 20)->create();
Sin embargo, si usáramos esa fábrica para crear 20 contactos, los 20 tendrían la
misma información. Eso es menos útil.
Obtendremos aún más beneficios de las fábricas modelo cuando aprovechemos la
instancia de Faker que ha pasado al cierre; Faker facilita la aleatorización de la
creación de datos falsos estructurados. El ejemplo anterior ahora se convierte en el
ejemplo 5-9.
volver [
});
Ahora, cada vez que creamos un contacto falso usando esta fábrica de modelos, todos
nuestros lazos adecuados se generarán aleatoriamente.
factory(Post::class)->create([
]);
$post->comments()->save(factory(Comment::class)-
>make([ 'user_id' = > $u->id,
]));
});
Anulación de propiedades al llamar a una fábrica de modelos. Si pasa una matriz a make() o
create(), puede anular claves específicas de fábrica, como hicimos en el Ejemplo
5-10 para establecer el user_id en el comentario y establecer manualmente el título
de nuestra publicación.
Generar más de una instancia con una fábrica de modelos. Si pasa un número como segundo
parámetro al ayudante factory(), puede especificar que está creando más de una
instancia. En lugar de devolver una sola instancia, devolverá una colección de
instancias. Esto significa que puede tratar el resultado como una matriz, puede
asociar cada una de sus instancias con otra entidad, o puede usar otros métodos de
entidad en cada instancia, como usamos each() en el Ejemplo 5-10 para agregar un
comentario de cada nueva creación . usuario.
volver [
},
];
});
volver [
return factory(App\Company::class)->create()->id;
},
return App\Company::find($contact['company_id'])->size;
},
];
});
volver [
'name' => $faker-
>name, 'email '
=> $faker-
>email,
];
});
Pero a veces se necesita más de una fábrica para una clase de objeto. ¿Qué
pasa si necesitamos poder agregar algunos contactos que son personas muy
importantes (VIP)? Podemos usar el método state() para definir un
segundo estado de fábrica para esto, como se ve en el Ejemplo 5-13. El
primer parámetro a state() sigue siendo el nombre de la entidad que está
generando, el segundo es el nombre de su estado y el tercero es una
matriz de cualquier atributo que desee establecer específicamente para
este estado.
volver [
];
});
$factory->state(Contacto::class,
'vip', [ 'vip' => true,
]);
volver [
];
});
Generador de consultas
Ahora que está conectado y ha migrado y sembrado sus tablas,
comencemos con cómo usar las herramientas de base de datos. En el núcleo
de cada pieza de la funcionalidad de la base de datos de Laravel se
encuentra el generador de consultas, una interfaz fluida para interactuar
con diferentes tipos de bases de datos con una única API clara.
$users = .DB::escoger([«Tabla' => 'Usuarios', 'dónde' => ['tipo' => 'donante»] ]);
Fluido: