Capítulo 1. ¿Por qué Laravel? ¿Por qué Laravel?
Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com
En los primeros días de la web dinámica, escribir una aplicación web tenía un aspecto muy diferente al actual. Los desarrolladores de entonces eran responsables de escribir el código no sólo para la lógica empresarial exclusiva de nuestras aplicaciones, sino también para cada uno de los componentes que son tan comunes en los sitios: autenticación de usuarios, validación de entradas, acceso a bases de datos, plantillas y mucho más.
Hoy en día, los programadores disponen de docenas de marcos de desarrollo de aplicaciones y miles de componentes y bibliotecas fácilmente accesibles. Es un refrán común entre los programadores que, para cuando aprendes un framework, ya han aparecido tres frameworks más nuevos (y supuestamente mejores) que pretenden sustituirlo.
"Sólo porque está ahí" puede ser una justificación válida para escalar una montaña, pero hay mejores razones para elegir utilizar un marco específico, o para utilizar un marco en absoluto. Merece la pena plantearse la pregunta: ¿por qué frameworks? Más concretamente, ¿por qué Laravel?
¿Por qué utilizar un marco?
Es fácil ver por qué es beneficioso utilizar los componentes individuales, o paquetes, que están a disposición de los desarrolladores de PHP. Con los paquetes, otra persona se encarga de desarrollar y mantener un trozo aislado de código que tiene una función bien definida y, en teoría, esa persona tiene un conocimiento más profundo de este componente único del que tú tienes tiempo de tener.
Los frameworks como Laravel -y Symfony, Lumen y Slim- preempaquetan una colección de componentes de terceros junto con "pegamento" de framework personalizado, como archivos de configuración, proveedores de servicios, estructuras de directorios prescritas y bootstraps de aplicaciones. Por tanto, la ventaja de utilizar un marco en general es que alguien ha tomado decisiones por ti no sólo sobre los componentes individuales, sino también sobre cómo deben encajar esos componentes entre sí.
"Lo construiré yo mismo"
Supongamos que empiezas una nueva aplicación web sin las ventajas de un framework. ¿Por dónde empiezas? Bueno, probablemente debería enrutar las solicitudes HTTP, así que ahora tienes que evaluar todas las bibliotecas de solicitudes y respuestas HTTP disponibles y elegir una. Luego tendrás que elegir un enrutador. Ah, y probablemente tendrás que crear algún tipo de archivo de configuración de rutas. ¿Qué sintaxis debe utilizar? ¿Dónde debe ir? ¿Y los controladores? ¿Dónde viven y cómo se cargan? Bueno, probablemente necesites un contenedor de inyección de dependencias para resolver los controladores y sus dependencias. ¿Pero cuál?
Además, si te tomas el tiempo necesario para responder a todas esas preguntas y creas con éxito tu aplicación, ¿cuál es el impacto en el siguiente desarrollador? ¿Y cuando tengas cuatro de esas aplicaciones basadas en marcos personalizados, o una docena, y tengas que recordar dónde viven los controladores en cada una o cuál es la sintaxis de enrutamiento?
Coherencia y flexibilidad
Los frameworks abordan este problema proporcionando una respuesta cuidadosamente estudiada a la pregunta "¿Qué componente debemos utilizar aquí?" y garantizando que los componentes concretos elegidos funcionen bien juntos. Además, los marcos proporcionan convenciones que reducen la cantidad de código que un desarrollador nuevo en el proyecto tiene que entender: si entiendes cómo funciona el enrutamiento en un proyecto Laravel, por ejemplo, entenderás cómo funciona en todos los proyectos Laravel.
Cuando alguien prescribe desarrollar tu propio marco de trabajo para cada nuevo proyecto, lo que realmente está defendiendo es la capacidad de controlar lo que entra y lo que no entra en la base de tu aplicación. Eso significa que los mejores frameworks no sólo te proporcionarán una base sólida, sino que también te darán la libertad de personalizarlos a tu antojo. Y esto, como te mostraré en el resto de este libro, es parte de lo que hace que Laravel sea tan especial.
Breve Historia de los Frameworks Web y PHP
Una parte importante de para poder responder a la pregunta "¿Por qué Laravel?" es comprender la historia de Laravel y entender lo que vino antes. Antes del aumento de popularidad de Laravel, había una gran variedad de frameworks y otros movimientos en PHP y otros espacios de desarrollo web.
Ruby en Rails
David Heinemeier Hansson publicó la primera versión de Ruby on Rails en 2004, y desde entonces ha sido difícil encontrar un marco de aplicaciones web que no se haya visto influido por Rails de alguna manera.
Rails popularizó MVC, las API RESTful JSON, la convención sobre la configuración, ActiveRecord y muchas más herramientas y convenciones que influyeron profundamente en la forma en que los desarrolladores web enfocaban sus aplicaciones, especialmente en lo que respecta al desarrollo rápido de aplicaciones.
La afluencia de frameworks PHP
La mayoría de los desarrolladores tenían claro que Rails y otros marcos de aplicaciones web similares eran la ola del futuro, y los marcos PHP, incluidos los que imitaban a Rails, empezaron a aparecer rápidamente.
CakePHP fue el primero en 2005, y pronto le siguieron Symfony, CodeIgniter, Zend Framework y Kohana (un fork de CodeIgniter). Yii llegó en 2008, y Aura y Slim en 2010. El año 2011 trajo FuelPHP y Laravel, que no eran exactamente derivaciones de CodeIgniter, sino que se proponían como alternativas.
Algunos de estos marcos eran más propios de Rails, y se centraban en mapeadores objeto-relacionales (ORM) de bases de datos, estructuras MVC y otras herramientas orientadas al desarrollo rápido. Otros, como Symfony y Zend, se centraban más en patrones de diseño empresarial y comercio electrónico.
Lo bueno y lo malo de CodeIgniter
CakePHP y CodeIgniter fueron los dos primeros frameworks PHP que mostraron más abiertamente hasta qué punto se inspiraban en Rails. CodeIgniter saltó rápidamente a la fama y en 2010 era posiblemente el más popular de los frameworks PHP independientes.
CodeIgniter era sencillo, fácil de usar, y contaba con una documentación asombrosa y una comunidad fuerte. Pero su uso de tecnología y patrones modernos avanzaba lentamente; y a medida que el mundo de los frameworks crecía y las herramientas de PHP avanzaban, CodeIgniter empezó a quedarse atrás tanto en avances tecnológicos como en funciones listas para usar. A diferencia de muchos otros frameworks, CodeIgniter estaba gestionado por una empresa, y tardó en ponerse al día con las nuevas funciones de PHP 5.3, como los espacios de nombres y los cambios a GitHub y más tarde a Composer. Fue en 2010 cuando Taylor Otwell, creador de Laravel, se sintió lo suficientemente insatisfecho con CodeIgniter como para lanzarse a escribir su propioframework.
Laravel 1, 2 y 3
La primera beta de Laravel 1 se publicó en junio de 2011, y se escribió completamente desde cero. Incluía 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, etc.
El desarrollo inicial de Laravel avanzó rápidamente, y Laravel 2 y 3 se publicaron 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 Eloquent y migraciones.
Laravel 4
Con Laravel 4, Taylor reescribió todo el framework desde cero. En ese momento, Composer, el ahora omnipresente gestor de paquetes de PHP, estaba dando muestras de convertirse en un estándar del sector, y Taylor vio el valor de reescribir el framework como una colección de componentes, distribuidos y agrupados por Composer.
Taylor desarrolló un conjunto de componentes bajo el nombre de código Illuminate y, en mayo de 2013, lanzó Laravel 4 con una estructura totalmente nueva. En lugar de empaquetar la mayor parte de su código como descarga, Laravel ahora extraía la mayoría de sus componentes de Symfony (otro framework que liberaba sus componentes para que los utilizaran otros) y los componentes Illuminate a través de Composer.
Laravel 4 también introdujo colas, un componente de correo, fachadas y sembrado de bases de datos. Y como Laravel se basaba ahora en componentes de Symfony, se anunció que Laravel reflejaría (no exactamente, pero poco después) el calendario de lanzamientos de seis meses que sigue Symfony.
Laravel 5
El lanzamiento de Laravel 4.3 estaba previsto para noviembre de 2014, pero a medida que avanzaba el desarrollo se hizo evidente que la importancia de sus cambios merecía un lanzamiento mayor, y Laravel 5 se lanzó en febrero de 2015.
Laravel 5 presentaba una estructura de directorios renovada, la eliminación de los ayudantes de formularios y HTML, la introducción de las interfaces de contrato, un aluvión de nuevas vistas, Socialite para la autenticación en redes sociales, Elixir para la compilación de activos, Scheduler para simplificar cron, dotenv para una gestión simplificada del entorno, solicitudes de formularios y un flamante REPL (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.
Laravel 6
En septiembre de 2019, se introdujo Laravel 6 con dos cambios principales: en primer lugar, la eliminación de los ayudantes globales de cadenas y matrices que ofrece Laravel (en favor de las fachadas); y en segundo lugar, el paso a SemVer (versionado semántico) para la numeración de versiones. El efecto práctico de este cambio significa que, para todas las versiones de Laravel posteriores a la 5, se publican versiones mayores (6, 7, etc.) y menores (6.1, 6.2, etc.) con mucha más frecuencia.
Versiones de Laravel en el nuevo mundo SemVer (6+)
A partir de la versión 6, los lanzamientos de Laravel son menos monumentales que en el pasado debido al nuevo calendario de lanzamientos SemVer. Así que, en adelante, los lanzamientos tendrán más que ver con el tiempo transcurrido y menos con grandes novedades muy concretas.
¿Qué tiene de especial Laravel?
Así que, ¿qué es lo que diferencia a Laravel? ¿Por qué merece la pena tener más de un framework PHP a la vez? De todas formas, todos utilizan componentes de Symfony, ¿no? Hablemos un poco de lo que hace "vibrar" a Laravel.
La filosofía de Laravel
Basta con leer los materiales de marketing de Laravel y los README para empezar a ver sus valores. Taylor utiliza palabras relacionadas con la luz como "Illuminate" y "Spark". Y luego están éstas: "Artesano". "Elegantes". Y también éstas: "Aliento de aire fresco". "Nuevo comienzo". Y por último: "Rápido". "Velocidad Warp".
Los dos valores más fuertemente comunicados del marco son aumentar la velocidad y la felicidad de los desarrolladores. Taylor ha descrito el lenguaje "Artesano" como un contraste intencionado contra valores más utilitarios. Puedes ver la génesis de este tipo de pensamiento en su pregunta de 2011 en StackExchange en la que afirmaba: "A veces paso cantidades ridículas de tiempo (horas) agonizando por hacer que el código 'parezca bonito'" sólo por el bien de una mejor experiencia de mirar el código en sí. Y a menudo ha hablado del valor de facilitar y agilizar que los desarrolladores lleven sus ideas a buen puerto, deshaciéndose de barreras innecesarias para crear grandes productos.
Laravel trata, en esencia, de equipar y capacitar a los desarrolladores. Su objetivo es proporcionar un código claro, sencillo y bonito, así como funciones que ayuden a los desarrolladores a aprender, empezar, desarrollar y escribir rápidamente un código sencillo, claro y duradero.
El concepto de dirigirse a los desarrolladores está claro en todos los materiales de Laravel. "Los desarrolladores felices hacen el mejor código" está escrito en la documentación. "La felicidad de los desarrolladores desde la descarga hasta la implementación" fue el eslogan no oficial durante un tiempo. Por supuesto, cualquier herramienta o marco de trabajo dirá que quiere que los desarrolladores sean felices. Pero tener la felicidad de los desarrolladores como preocupación principal, en lugar de secundaria, ha tenido un enorme impacto en el estilo de Laravel y en el progreso de la toma de decisiones. Mientras que otros marcos pueden tener como objetivo principal la pureza arquitectónica, o la compatibilidad con los objetivos y valores de los equipos de desarrollo de las empresas, Laravel se centra principalmente en servir al desarrollador individual. Eso no significa que no puedas escribir aplicaciones arquitectónicamente puras o preparadas para la empresa en Laravel, pero no tendrá que ser a expensas de la legibilidad y comprensibilidad de tu código base.
Cómo Laravel logra la felicidad de los desarrolladores
Sólo decir que quieres hacer felices a los desarrolladores es una cosa. Hacerlo es otra, y requiere que te cuestiones qué es lo más probable que haga infelices a los desarrolladores y qué es lo más probable que les haga felices. Laravel intenta facilitar la vida de los desarrolladores de varias formas.
En primer lugar, Laravel es un marco de desarrollo rápido de aplicaciones. Esto significa que se centra en una curva de aprendizaje poco profunda (fácil) y en minimizar los pasos entre el inicio de una nueva aplicación y su publicación. Todas las tareas más comunes en la creación de aplicaciones web, desde las interacciones con bases de datos a la autenticación, pasando por las colas, el correo electrónico o el almacenamiento en caché, se simplifican gracias a los componentes que proporciona Laravel. Pero los componentes de Laravel no sólo son geniales por sí mismos, sino que proporcionan una API coherente y estructuras predecibles en todo el framework. Eso significa que, cuando pruebes algo nuevo en Laravel, es más que probable que acabes diciendo: "...y simplemente funciona".
Esto tampoco termina con el propio framework. Laravel proporciona todo un ecosistema de herramientas para construir y lanzar aplicaciones. Tienes Sail, Valet y Homestead para el desarrollo local, Forge para la gestión de servidores, y Envoyer y Vapor para la implementación avanzada. Y hay un conjunto de paquetes complementarios: Cashier para pagos y suscripciones, Echo para WebSockets, Scout para búsquedas, Sanctum y Passport para autenticación de API, Dusk para pruebas frontales, Socialite para inicio de sesión social, Horizon para monitoreo de colas, Nova para crear paneles de administración y Spark para arrancar tu SaaS. Laravel intenta eliminar el trabajo repetitivo de los desarrolladores para que puedan hacer algo único.
Además, Laravel se centra en "la convención por encima de la configuración", lo que significa que si estás dispuesto a utilizar los valores predeterminados de Laravel, tendrás que hacer mucho menos trabajo que con otros frameworks que requieren que declares todos tus ajustes aunque estés utilizando la configuración recomendada. Los proyectos construidos con Laravel llevan menos tiempo que los construidos con la mayoría de los demás frameworks PHP.
Laravel también se centra mucho en la simplicidad. Es posible utilizar inyección de dependencias y mocking y el patrón Data Mapper y repositorios y segregación de responsabilidad de consulta de comandos y todo tipo de otros patrones arquitectónicos más complejos con Laravel, si quieres. Pero mientras que otros frameworks podrían sugerir el uso de esas herramientas y estructuras en cada proyecto, Laravel y su documentación y comunidad se inclinan por empezar con la implementación más sencilla posible: una función global aquí, una fachada allá, ActiveRecord por allá. Esto permite a los desarrolladores crear la aplicación más sencilla posible para resolver sus necesidades, sin limitar su utilidad en entornos complejos.
Una fuente interesante de la diferencia entre Laravel y otros frameworks PHP es que su creador y su comunidad están más conectados e inspirados por Ruby and Rails y los lenguajes de programación funcionales que por Java. Hay una fuerte corriente en el PHP moderno que se inclina hacia la verbosidad y la complejidad, abrazando los aspectos más Java-escos de PHP. Pero Laravel tiende a estar en el otro lado, abrazando prácticas de codificación y características del lenguaje expresivas, dinámicas y sencillas.
La Comunidad Laravel
Si este libro es tu primer contacto con la comunidad Laravel, estás de enhorabuena. 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 videotutoriales Laracasts de Jeffrey Way a Laravel News y los canales Slack e IRC y Discord, desde los amigos de Twitter a los blogueros, pasando por los podcasts y las conferencias Laracon, Laravel tiene una comunidad rica y vibrante llena de gente que ha estado por aquí desde el primer día y gente que acaba de empezar su propio "primer día". Y esto no es un accidente:
Desde el principio de Laravel, he tenido la idea de que todas las personas quieren sentir que forman parte de algo. Es un instinto humano natural querer pertenecer y ser aceptado en un grupo de personas con ideas afines. Así que, inyectando personalidad en un framework web y siendo realmente activo con la comunidad, ese tipo de sentimiento puede crecer en la comunidad.
Taylor Otwell, entrevista de Producto y Soporte
Taylor comprendió desde los primeros días de Laravel que un proyecto de código abierto de éxito necesitaba dos cosas: una buena documentación y una comunidad acogedora. Y esas dos cosas son ahora señas de identidad de Laravel.
Cómo funciona
Hasta hasta ahora, todo lo que he compartido aquí ha sido totalmente abstracto. ¿Qué pasa con el código, te preguntarás? Vamos a profundizar en una aplicación sencilla(Ejemplo 1-1) para que puedas ver cómo es realmente trabajar con Laravel día a día.
Ejemplo 1-1. "Hola, mundo" en routes/web.php
<?
php
Route
::
get
(
'/'
,
function
()
{
return
'Hello, World!'
;
});
La acción más sencilla que puedes realizar en una aplicación Laravel es definir una ruta y devolver un resultado cada vez que alguien visite esa ruta. Si inicializas una aplicación Laravel nueva en tu máquina, defines la ruta del Ejemplo 1-1 y luego sirves el sitio desde el directorio público, tendrás un ejemplo de "Hola, mundo" totalmente funcional (ver Figura 1-1).
El aspecto es muy similar con los controladores, como puedes ver en el Ejemplo 1-2 (que, si quieres probar de inmediato, requiere que ejecutes primero php artisan make:controller WelcomeController
para crear el controlador).
Ejemplo 1-2. "Hola, mundo" con controladores
// File: routes/web.php
<?
php
use
App\Http\Controllers\WelcomeController
;
Route
::
get
(
'/'
,
[
WelcomeController
::
class
,
'index'
]);
// File: app/Http/Controllers/WelcomeController.php
<?
php
namespace
App\Http\Controllers
;
class
WelcomeController
extends
Controller
{
public
function
index
()
{
return
'Hello, World!'
;
}
}
Y si almacenas tus saludos en una base de datos, también tendrá un aspecto bastante similar (véase el Ejemplo 1-3).
Ejemplo 1-3. Multidifusión "Hola, mundo" con acceso a la base de datos
// File: routes/web.php
<?
php
use
App\Greeting
;
Route
::
get
(
'create-greeting'
,
function
()
{
$greeting
=
new
Greeting
;
$greeting
->
body
=
'Hello, World!'
;
$greeting
->
save
();
});
Route
::
get
(
'first-greeting'
,
function
()
{
return
Greeting
::
first
()
->
body
;
});
// File: app/Models/Greeting.php
<?
php
namespace
App\Models
;
use
Illuminate\Database\Eloquent\Factories\HasFactory
;
use
Illuminate\Database\Eloquent\Model
;
class
Greeting
extends
Model
{
use
HasFactory
;
}
// File: database/migrations/2023_03_12_192110_create_greetings_table.php
<?
php
use
Illuminate\Database\Migrations\Migration
;
use
Illuminate\Database\Schema\Blueprint
;
use
Illuminate\Support\Facades\Schema
;
return
new
class
extends
Migration
{
/**
* Run the migrations.
*/
public
function
up
()
:
void
{
Schema
::
create
(
'greetings'
,
function
(
Blueprint
$table
)
{
$table
->
id
();
$table
->
string
(
'body'
);
$table
->
timestamps
();
});
}
/**
* Reverse the migrations.
*/
public
function
down
()
:
void
{
Schema
::
dropIfExists
(
'greetings'
);
}
};
Puede queel Ejemplo 1-3 te resulte un poco abrumador, y si es así, sáltatelo. Aprenderás todo lo que ocurre aquí en capítulos posteriores, pero ya puedes ver que con unas pocas líneas de código, puedes configurar migraciones y modelos de bases de datos y extraer registros. Es así de sencillo.
Get Laravel: Up & Running, 3ª Edición now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.