Tutorial de Laravel para principiantes

โšก Resumen inteligente

Laravel es un framework MVC de PHP de cรณdigo abierto creado por Taylor Otwell para desarrollar aplicaciones web de forma rรกpida y limpia. Este tutorial explica quรฉ es Laravel, cรณmo instalarlo con Composer y crea una aplicaciรณn funcional de carga de archivos utilizando rutas, controladores, validaciรณn de formularios y plantillas Blade.

  • ๐ŸŽ‚ Quรฉ es Laravel: Laravel es un moderno framework MVC para PHP con gestor de paquetes, herramientas de base de datos y sintaxis expresiva para un desarrollo rรกpido.
  • ๐Ÿ“ฆ Instalaciรณn de Composer: Composer instala Laravel; el comando laravel new crea una aplicaciรณn nueva con su estructura de directorios completa.
  • ๐Ÿงญ Rutas: Las rutas en routes/web.php asignan una URI y un verbo HTTP a un mรฉtodo del controlador y se les pueden dar nombres fรกciles de recordar.
  • ๐ŸŽ›๏ธ Controladores: Un controlador recibe la solicitud y devuelve una respuesta, keeping La lรณgica de acciรณn es independiente de las definiciones de ruta.
  • โœ… Solicitudes de formularios: Una clase de solicitud de formulario contiene reglas de validaciรณn, por lo que los datos no vรกlidos se rechazan antes de que lleguen al controlador.
  • ๐Ÿ–ผ๏ธ Plantillas de cuchillas: Blade renderiza HTML con directivas como @csrf y route(), en este caso combinadas con jQuery para cargas asรญncronas.
  • ๐Ÿค– Asistencia de IA: Las herramientas de IA pueden servir de base para una aplicaciรณn CRUD de Laravel y ayudar a actualizar un proyecto antiguo a la versiรณn actual de Laravel.

Tutorial de Laravel

ยฟQuรฉ es Laravel?

Laravel es un marco web MVC de cรณdigo abierto para PHP. Laravel es un marco robusto que proporciona un desarrollo sencillo de aplicaciones web PHP con caracterรญsticas como un sistema de empaquetado modular con un administrador de dependencias dedicado, acceso a bases de datos relacionales y otras utilidades para la implementaciรณn y el mantenimiento de aplicaciones.

Laravel fue creado por Taylor Otwell. Desde su lanzamiento inicial en junio de 2011 (versiรณn 1), ha ganado popularidad de forma constante en el sector de los frameworks PHP para el desarrollo web. Gran parte de esta popularidad se debe a las numerosas funcionalidades que incluye de forma predeterminada, pensadas para el desarrollador.

ยฟPor quรฉ Laravel?

Alrededor del aรฑo 2000, la mayorรญa Cรณdigo PHP era procesal y podรญa encontrarse en forma de โ€œguionesโ€ que contendrรญan una maraรฑa de cรณdigo espagueti. Incluso las pรกginas mรกs simples no tenรญan separaciรณn de interesesPor lo tanto, era bastante fรกcil que una aplicaciรณn se convirtiera rรกpidamente en una pesadilla de mantenimiento. El mundo necesitaba algo mejor. Asรญ llegรณ PHP versiรณn 5 y una variedad de frameworks de PHP que intentaban aportar la estructura necesaria y mejores soluciones a diversos problemas de las aplicaciones web.

Desde entonces, hemos visto el lanzamiento de numerosos frameworks que sentaron las bases de los frameworks populares que se utilizan hoy en dรญa. Actualmente, los tres mejores serรญan (en nuestra opiniรณn) Zend Framework, Symfony y, por supuesto, Laravel. Si bien cada uno de estos frameworks se basa en principios similares y estรก orientado a resolver (bรกsicamente) los mismos problemas comunes, sus principales diferencias radican en sus implementaciones. Cada uno tiene sus propias particularidades en la forma de abordar los problemas. Al analizar el cรณdigo producido por cada uno de ellos, se observa una clara distinciรณn entre ellos. En nuestra humilde opiniรณn, el framework Laravel es el mejor.

Aprenda mรกs sobre la diferencia entre Laravel y CodeEncendedor.

Cรณmo descargar e instalar Laravel con Composer

Nota: Este tutorial fue escrito para Laravel 5.8, pero los conceptos de enrutamiento, controlador, solicitud y Blade siguen siendo los mismos en las versiones actuales. A fecha de 2026, la รบltima versiรณn es Laravel 13 (lanzada en marzo de 2026), que requiere PHP 8.3 o posterior, mientras que Laravel 12 requiere PHP 8.2.

Nota: Se da por sentado que ya tienes una copia de PHP instalada en tu sistema local. Si no es asรญ, puedes leer cรณmo instalarla. aquรญ.

Composer es un gestor de paquetes y dependencias. Para instalarlo, abre una terminal y haz clic en cd en un nuevo directorio. Ejecuta este comando:

curl -Ss getcomposer.org/installer | php

Los resultados de este comando se verรกn asรญ:

Descargar e instalar Laravel con Composer

Nota: Para obtener instrucciones mรกs detalladas sobre la configuraciรณn de Laravel, consulte la documentaciรณn de Laravel. aquรญ.

Verรกs que se descarga y compila el script composer.phar, que es el que usamos para instalar Laravel. Aunque existen numerosas formas de configurar una nueva aplicaciรณn Laravel, lo haremos mediante el script composer de Laravel. Para instalar este script, ejecuta:

composer global require laravel/installer

Que se verรก algo asรญ:

Descargar e instalar Laravel con Composer

Esto descargarรก e instalarรก todos los archivos del framework, asรญ como todas las dependencias necesarias. Los paquetes se guardarรกn dentro del directorio vendor. Una vez descargado e instalado, basta con ejecutar el siguiente comando:

laravel new uploadApp

Verรก algo parecido al siguiente resultado:

Descargar e instalar Laravel con Composer

Composer estรก instalando todos los paquetes que Laravel necesita para funcionar. Esto puede tardar unos minutos, asรญ que ten paciencia. Una vez finalizado, ejecuta el comando `ls -al` para ver quรฉ paquetes se han instalado.

Aquรญ hay un breve desglose de los directorios en una aplicaciรณn Laravel comรบn:

  • aplicaciรณn/: Esta es la carpeta de origen donde reside el cรณdigo de nuestra aplicaciรณn. Todos los controladores, polรญticas y modelos se encuentran dentro de esta carpeta.
  • arranque/: Contiene el script de inicio de la aplicaciรณn y algunos archivos de mapeo de clases.
  • configuraciรณn/: Contiene los archivos de configuraciรณn de la aplicaciรณn. Estos archivos normalmente no se modifican directamente, sino que dependen de los valores configurados en el archivo .env (entorno) ubicado en la raรญz de la aplicaciรณn.
  • base de datos/: Contiene los archivos de la base de datos, incluidas las migraciones, las semillas y las fรกbricas de pruebas.
  • pรบblico/ : Carpeta de acceso pรบblico que contiene los archivos compilados y, por supuesto, un archivo index.php.
  • recursos/ : Contiene recursos de interfaz de usuario como JavaArchivos de script, archivos de idioma, archivos CSS/SASS y todas las plantillas utilizadas en la aplicaciรณn (denominadas plantillas blade).
  • rutas/ : Todas las rutas de la aplicaciรณn se encuentran aquรญ. Existen diferentes "รกmbitos" de rutas, pero en el que nos centraremos es en el archivo web.php.
  • almacenamiento/ : Todos los archivos de cachรฉ temporales utilizados por la aplicaciรณn, archivos de sesiรณn, scripts de vista compilados y archivos de registro.
  • pruebas/ : Contiene archivos de prueba para la aplicaciรณn, como pruebas unitarias y pruebas funcionales.
  • proveedor/ : Todos los paquetes de dependencias se instalaron con Composer.

Ahora bien, vamos a completar el resto de la aplicaciรณn y ejecutarla con un comando especial de Artisan (para ahorrarnos la molestia de instalar y configurar un servidor web como Apache o nginx). El archivo .env contiene todos los valores de configuraciรณn que los archivos del directorio /config utilizan para configurar la aplicaciรณn.

Diseรฑo de aplicaciones: un rรกpido resumen de nuestros requisitos

En este tutorial en lรญnea de Laravel, crearemos una aplicaciรณn muy simple que harรก solo dos cosas:

  1. manejar la carga de archivos desde un formulario web
  2. Mostrar los archivos previamente subidos en una pรกgina diferente.

Para este proyecto, nuestra aplicaciรณn serรก de solo escritura, lo que significa que el usuario solo podrรก escribir archivos y ver la lista de archivos que ha subido. Esta aplicaciรณn es extremadamente bรกsica, pero deberรญa servirte como buena prรกctica para que empieces a desarrollar tus habilidades y conocimientos de Laravel. Ten en cuenta que, por brevedad, hemos omitido el modelado de bases de datos, las migraciones y la autenticaciรณn, pero en una aplicaciรณn real, estos son aspectos adicionales que deberรกs considerar.

Aquรญ hay una lista de componentes que necesitaremos para que la aplicaciรณn funcione como se espera:

  • A ruta Esto permitirรก que el mundo exterior (internet) utilice la aplicaciรณn, ademรกs de especificar el punto final que apuntarรก a la ubicaciรณn de la lรณgica para guardar el archivo subido.
  • A controlador que gestiona el flujo de solicitud a respuesta.
  • A plantilla que se utilizarรก para mostrar una lista de los archivos subidos previamente y el formulario de carga propiamente dicho.
  • A solicita que el controlador utilizarรก para validar los datos enviados desde el formulario web.

ยฟQuรฉ es una Ruta?

En Laravel, una ruta es bรกsicamente un punto final especificado por una URI que actรบa como un puntero a alguna funcionalidad de la aplicaciรณn. Generalmente, una ruta apunta a un mรฉtodo de un controlador y tambiรฉn determina quรฉ mรฉtodos HTTP pueden acceder a esa URI. Una ruta no siempre se refiere a un mรฉtodo de controlador; tambiรฉn puede simplemente delegar la ejecuciรณn de la aplicaciรณn a una funciรณn anรณnima o un Closure definido.

ยฟPor quรฉ usar una ruta?

Las rutas se almacenan dentro de archivos en la carpeta /routes dentro del directorio raรญz del proyecto. De manera predeterminada, hay algunos archivos diferentes que corresponden a los diferentes โ€œladosโ€ de la aplicaciรณn (โ€œladosโ€ proviene de la metodologรญa de arquitectura hexagonal). Estos incluyen:

  • web.php: las rutas pรบblicas basadas en el navegador. Estas son las mรกs comunes y son las que recibe el navegador web. Se ejecutan a travรฉs del grupo de middleware web y tambiรฉn contienen funcionalidades para Protecciรณn CSRF (lo que ayuda a defenderse de ataques maliciosos basados โ€‹โ€‹en formularios) y generalmente contienen cierto grado de "estado" (con esto queremos decir que utilizan sesiones).
  • api.php: rutas que corresponden a un grupo de API y, por lo tanto, tienen el middleware de API habilitado por defecto. Estas rutas no tienen estado y no tienen sesiones ni memoria entre solicitudes (una solicitud no comparte datos ni memoria con ninguna otra; cada una estรก encapsulada de forma independiente).
  • console.php: estas rutas corresponden a comandos personalizados de Artisan que has creado para tu aplicaciรณn.
  • channels.php: registra rutas para la transmisiรณn de eventos.

El archivo clave que debemos tener en cuenta en este momento es el especรญfico del navegador, web.php. Ya existe una ruta definida por defecto, que es la que se selecciona al navegar a la raรญz web de la aplicaciรณn (la raรญz web se encuentra en el directorio pรบblico). Necesitaremos tres rutas diferentes para que nuestra aplicaciรณn de carga funcione:

  • /upload: esta serรก la URI de la pรกgina principal que muestra nuestro formulario web para subir archivos.
  • /process: aquรญ es donde el formulario ubicado en la URI /upload envรญa los datos que ha enviado (la โ€œacciรณnโ€ del formulario).
  • /list: esto mostrarรก una lista de todos los archivos subidos al sitio.

Nota: Puede que no sea necesario el punto final /list si quisiรฉramos poner toda la lรณgica para mostrar el formulario de carga y la lista de archivos en una sola pรกgina; sin embargo, por ahora los hemos mantenido separados para aรฑadir un poco mรกs de informaciรณn al tema en cuestiรณn.

//inside routes/web.php
Route::get('/upload', 'UploadController@upload')->name('upload');
Route::get('/download', 'UploadController@download')->name('download');
Route::post('/process', 'UploadController@process')->name('process');
Route::get('/list', 'UploadController@list')->name('list');

En este tutorial del framework Laravel, para cada ruta deseada, la listaremos explรญcitamente en el archivo de rutas web.php utilizando uno de los mรฉtodos de solicitud HTTP especรญficos disponibles (get(), post(), put(), delete(), patch() u options()). Para obtener un desglose de cada uno de ellos, consulte este vรญdeo Estos mรฉtodos especifican quรฉ verbos HTTP pueden acceder a esa ruta. Si necesitas que una ruta acepte mรกs de un verbo HTTP (lo cual podrรญa ocurrir si usas una sola pรกgina para mostrar los datos iniciales y enviar los datos del formulario), puedes usar el mรฉtodo Route::any().

El segundo argumento de los mรฉtodos Route::get() y Route::post() (y de cualquier otro mรฉtodo relacionado con verbos HTTP en la fachada Route) es el nombre de un controlador especรญfico y el mรฉtodo que contiene dicho controlador y que se ejecuta al acceder al punto final de la ruta con la solicitud HTTP permitida (GET, POST, PATCH, etc.). Estamos utilizando UploadController para todas las rutas y las hemos especificado de la siguiente manera:

ยฟQuรฉ es una ruta?

El รบltimo mรฉtodo que llamamos en cada ruta es su funciรณn name(), que acepta una sola cadena como argumento y se utiliza para mรกs o menos โ€œetiquetarโ€ una ruta en particular con un nombre fรกcil de recordar (en nuestros casos, upload, process y list). Puede que no parezca una gran caracterรญstica darle a cada ruta su propio nombre cuando URL Tiene exactamente el mismo nombre, pero resulta muy รบtil cuando se tiene una ruta especรญfica como /users/profile/dashboard/config, que serรญa mรกs fรกcil de recordar como profile-admin o user-config.

Una nota sobre las fachadas:

  • Las fachadas proporcionan una interfaz "estรกtica" para las clases que estรกn disponibles en el contenedor de servicios de la aplicaciรณn.
  • Proporcionan una sintaxis concisa y memorable que le permite utilizar las funciones de Laravel sin recordar nombres de clases largos que deben inyectarse o configurarse manualmente.

En las definiciones de ruta anteriores, utilizamos la fachada Route en lugar de instanciar manualmente un nuevo objeto Illuminate/Routing/Router y llamar a los mรฉtodos correspondientes en ese objeto. Es simplemente un atajo que ahorra tiempo.pingLas fachadas se utilizan mucho en todo el framework Laravel; puedes y debes familiarizarte mรกs con ellas. La documentaciรณn sobre fachadas se puede encontrar aquรญ.

ยฟQuรฉ es un controlador?

Un controlador es la โ€œCโ€ de la arquitectura โ€œMVCโ€ (Modelo-Vista-Controlador), en la que se basa Laravel. El trabajo de un controlador se puede resumir en esta sencilla definiciรณn: Recibe la solicitud del cliente y le devuelve una respuesta. Esta es la definiciรณn bรกsica y tambiรฉn el requisito mรญnimo de cualquier controlador. Lo que hace entre estos dos puntos se considera generalmente la "acciรณn" del controlador (o la "implementaciรณn de la ruta"). Actรบa como el segundo punto de entrada a la aplicaciรณn (el primero es la solicitud) para el cliente, quien envรญa la carga รบtil de la solicitud (que veremos a continuaciรณn) a la aplicaciรณn, esperando algรบn tipo de respuesta (en forma de pรกgina de รฉxito, redirecciรณn, pรกgina de error o cualquier otro tipo de respuesta HTTP).

Un controlador hace (bรกsicamente) lo mismo que una definiciรณn de ruta con una funciรณn anรณnima establecida como la "acciรณn" cuando se accede a esa ruta. La diferencia es que un controlador se adapta bien a la separaciรณn de responsabilidades, mientras que una ruta se define en lรญnea con el cรณdigo real. URL definiciรณn, lo que bรกsicamente significa que estamos acoplando el URI asignado a la ruta con la implementaciรณn de la ruta, o el cรณdigo que se ejecuta cuando se accede a esa ruta.

Por ejemplo, los siguientes dos fragmentos de cรณdigo lograrรกn lo mismo:

Ejemplo #1: Definiciรณn e implementaciรณn de la ruta dentro de una sola llamada a un mรฉtodo (en el archivo de rutas web.php)

//inside routes/web.php
<?php
Route::get('/hello-world', function(Request $request) {
$name = $request->name;
return response()->make("<h1>Hello World! This is ".$name, 200);
});

Ejemplo n.ยฐ 2: La definiciรณn de la ruta se encuentra dentro de routes/web.php, pero su implementaciรณn reside dentro de la clase /app/Http/Controllers/HelloWorldController.

//inside routes/web.php
<?php

Route::get('/hello-world', 'HelloWorldController@index')->name('hello-world');

------------------------------------------------------------------------------------
//inside app/Http/Controllers/HelloWorldController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

class HelloWorldController extends Controller
{
public function index(Request $request)
{
$name = $request->name;
return response()->make("<h1>Hello World! This is ".$name, 200);
}
}

Aunque el ejemplo n.ยฐ 2 de Laravel parezca mucho mรกs trabajoso (lo cual no es cierto, solo un poco mรกs de cรณdigo), observe los beneficios que obtenemos al colocar nuestra lรณgica de acciรณn para la ruta "hello-world" dada dentro de un controlador en lugar de con la definiciรณn de la ruta como una funciรณn de devoluciรณn de llamada:

  1. Nuestra lรณgica estรก claramente separada en su propia clase (separaciรณn de responsabilidades).
  2. Nuestro controlador estรก configurado para extenderse mรกs adelante si necesitรกramos agregarle capacidades adicionales. Digamos que quisiรฉramos agregar una funciรณn de "adiรณs al mundo". En este caso, cambiarรญamos el nombre del controlador a un "HelloController" mรกs genรฉrico y luego definirรญamos dos mรฉtodos separados, Hola() y adiรณs(). Tambiรฉn necesitarรญamos definir dos rutas separadas que mapearan el /Hola y /adiรณs Las URI se vinculan al mรฉtodo correspondiente en el controlador. Esto es preferible a sobrecargar un archivo de rutas con la implementaciรณn de cada ruta definida como una funciรณn de devoluciรณn de llamada.
  3. Laravel tiene la capacidad incorporada de almacenar en cachรฉ todas las definiciones de ruta en la aplicaciรณn para acelerar el tiempo que lleva encontrar una ruta determinada (aumenta el rendimiento de la aplicaciรณn); sin embargo, Solo podrรกs aprovechar esto si todas las rutas definidas dentro de la aplicaciรณn estรกn configuradas mediante un mapa especรญfico del controlador.pings (vรฉase el ejemplo n.ยบ 2 anterior).

Vamos a ejecutar este comando que generarรก un nuevo controlador para nosotros.

// ...inside the project's root directory:
php artisan make:controller UploadController

Bรกsicamente, este comando genera un archivo auxiliar para un controlador llamado "UploadController" dentro del directorio principal de controladores en /app/Http/Controllers/UploadController.php. Puedes abrir ese archivo y echarle un vistazo. Es muy sencillo, ya que se trata solo de una versiรณn bรกsica del controlador, con la ruta de espacio de nombres correcta y las clases necesarias de las que hereda.

Generando la solicitud

Antes de continuar con este tutorial de PHP Laravel y realizar algunos cambios en el stub generado del UploadController, conviene crear primero la clase de solicitud. Esto se debe a que el mรฉtodo del controlador que gestiona la solicitud debe especificar el tipo del objeto de solicitud en su firma, lo que le permite validar automรกticamente los datos del formulario entrante (como se especifica en el mรฉtodo rules(); hablaremos de ello mรกs adelante). Por ahora, usemos de nuevo el comando artisan para generar nuestro stub de solicitud:

php artisan make:request UploadFileRequest

Este comando generarรก un archivo llamado UploadFileRequest dentro de app/Http/Requests/UploadFileRequest. Abre el archivo y รฉchale un vistazo. Verรกs que es muy sencillo, ya que solo contiene dos mรฉtodos: authorize() y rules().

Creando la lรณgica de validaciรณn

Vamos a modificar el stub de la solicitud para que se ajuste a las necesidades de nuestra aplicaciรณn. Modifique el archivo para que quede asรญ:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UploadFileRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'fileName' => 'required|string',
'userFile' => 'required|file'
];
}
}

No hay muchos cambios, pero fรญjense que el mรฉtodo `authorize()` ahora devuelve `true` en lugar de `false`. Este mรฉtodo decide si se permite o no que la solicitud ingrese a la aplicaciรณn. Si se establece en `false`, impide que la solicitud entre al sistema. Este serรญa un lugar muy รบtil para incluir cualquier verificaciรณn de autorizaciรณn del usuario o cualquier otra lรณgica que pueda determinar si la solicitud puede avanzar al controlador. Por ahora, simplemente devolvemos `true` para permitir que cualquier cosa utilice la solicitud.

El otro mรฉtodo, rules(), es donde entra en juego toda la magia en lo que respecta a la validaciรณn. La idea es simple: devolver un array que contenga un conjunto de reglas con el siguiente formato:

'formFieldName' => 'constraints this field has separated by pipe characters (|)'

Hay muchas restricciones de validaciรณn diferentes que Laravel admite de manera predeterminada. Para obtener una lista completa de ellas, consulte la documentaciรณn en lรญnea. aquรญPara nuestra aplicaciรณn de carga de archivos, habrรก dos campos que se envรญan mediante una solicitud POST desde un formulario en el frontend. El parรกmetro `fileName` debe incluirse en el cuerpo del formulario (es decir, es obligatorio) y se utiliza como el nombre de archivo con el que almacenaremos el archivo (esto se realiza en el controlador; lo veremos mรกs adelante). Tambiรฉn especificamos que el nombre del archivo debe ser una cadena agregando el carรกcter de barra vertical (|) seguido de la palabra "cadena". Las restricciones siempre se delimitan con barras verticales, lo que permite especificar cualquier criterio adicional para el campo en cuestiรณn en una sola lรญnea.

El segundo parรกmetro, userFile, es el archivo real que el usuario carga desde un formulario en una pรกgina web. userFile tambiรฉn es obligatorio y Debes ser un archivo. Nota: Si esperรกramos que el archivo subido fuera una imagen, usarรญamos la restricciรณn de imagen, que limitarรญa los tipos de archivo aceptados a uno de los formatos de imagen mรกs comunes (jpeg, png, bmp, gif o svg). Dado que queremos permitir que el usuario suba cualquier tipo de archivo, mantendremos la restricciรณn de validaciรณn de archivo.

Eso es prรกcticamente todo lo que hay que saber sobre el objeto de solicitud. Su funciรณn principal es simplemente contener el conjunto aceptable de criterios (restricciones) que deben cumplir los parรกmetros del cuerpo del formulario para poder continuar con la aplicaciรณn. Cabe destacar que estos dos campos (userFile y fileName) tambiรฉn deben especificarse en el cรณdigo HTML como campos de entrada (con el nombre del campo correspondiente al nombre dentro del objeto de solicitud).

Quizรกs te preguntes: esto define las caracterรญsticas que debe contener una solicitud de formulario, pero ยฟdรณnde se verifica realmente el cumplimiento de estas restricciones? Lo veremos a continuaciรณn.

Modificar el controlador

Abra la aplicaciรณn/Http/Controllers/UploadController y realice los siguientes cambios:

<?php

namespace App\Http\Controllers;

use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Http\Request;
use App\Http\Requests\UploadFileRequest; //our new request class
use Illuminate\Support\Facades\Storage;

class UploadController extends Controller
{
/**
* This is the method that will simply list all the files uploaded by name and provide a
* link to each one so they may be downloaded
*
* @param $request : A standard form request object
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* @throws BindingResolutionException
*/
public function list(Request $request)
{
$uploads = Storage::allFiles('uploads');

return view('list', ['files' => $uploads]);
}

/**
* @param $file
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
* @throws BindingResolutionException
*/
public function download($file)
{
return response()->download(storage_path('app/'.$file));
}

/**
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* @throws BindingResolutionException
*/
public function upload()
{
return view('upload');
}

/**
* This method will handle the file uploads. Notice that the parameter's typehint
* is the exact request class we generated in the last step. There is a reason for this!
*
* @param $request : The special form request for our upload application
* @return array|\Illuminate\Http\UploadedFile|\Illuminate\Http\UploadedFile[]|null
* @throws BindingResolutionException
*/
public function process(UploadFileRequest $request)
{
//At this point, the parameters passed into the $request (from form) are
//valid--they satisfy each of the conditions inside the rules() method

$filename = $request->fileName; //parameters have already been validated
$file = $request->file('userFile'); //so we don't need any additional isset()

$extension = $file->getClientOriginalExtension(); //grab the file extension
$saveAs = $filename . "." . $extension; //filename to save file under

$file->storeAs('uploads', $saveAs, 'local'); //save the file to local folder

return response()->json(['success' => true]); //return a success message
}
}

Por lo tanto, es un mรฉtodo bastante sencillo para guardar los archivos subidos al disco. A continuaciรณn, se muestra un desglose del mรฉtodo process() mencionado anteriormente:

  • Indique el tipo de la clase de solicitud en el mรฉtodo del controlador que realiza la funcionalidad principal para que podamos validar automรกticamente los datos entrantes.
  • Extraiga el archivo del objeto de solicitud (ahora validado) dentro del mรฉtodo del controlador.
  • Extrae el nombre del archivo de la solicitud.
  • Genere el nombre de archivo final que se utilizarรก para guardar el archivo. El mรฉtodo getClientOriginalExtension() simplemente toma la extensiรณn original del archivo cargado.
  • Almacene el archivo en el sistema de archivos local utilizando su mรฉtodo storeAs(), pasando la ruta nombrada dentro del directorio /storage como primer argumento y el nombre del archivo para guardarlo como segundo.
  • Devuelve una respuesta JSON que indique que la solicitud fue exitosa.

La plantilla de la hoja

La รบltima pieza importante de este rompecabezas es la plantilla blade, que contendrรก todo el HTML, CSS y JavaScript para nuestra sencilla aplicaciรณn. Aquรญ estรก el cรณdigo; lo explicaremos mรกs adelante.

<body>
<h1>Upload a file</h1>
<form id="uploadForm" name="uploadForm" action="{{route('process')}}" enctype="multipart/form-data">
@csrf
<label for="fileName">File Name:</label>
<input type="text" name="fileName" id="fileName" required /><br />
<label for="userFile">Select a File</label>
<input type="file" name="userFile" id="userFile" required />
<button type="submit" name="submit">Submit</button>
</form>
<h2 id="success" style="color:green;display:none">Successfully uploaded file</h2>
<h2 id="error" style="color:red;display:none">Error Submitting File</h2>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
$('#uploadForm').on('submit', function(e) {
e.preventDefault();
var form = $(this);
var url = form.attr('action');
$.ajax({
url: url,
type: "POST",
data: new FormData(this),
processData: false,
contentType: false,
dataType: "JSON",
success: function(data) {
$("#fileName").val("");
$("#userFile").val("");
}
}).done(function() {
$('#success').css('display', 'block');
window.setTimeout(()=>($("#success").css('display', 'none')), 5000);
}).fail(function() {
$('#error').css('display', 'block');
window.setTimeout(()=>($("#error").css('display', 'none')), 5000);
});
});
</script>
</body>
</html>

Esto es lo que nuestro /subir la pรกgina se parece a:

La plantilla de la hoja

Este es un ejemplo muy tรญpico de un archivo blade que contiene un formulario HTML y JavaScript/jQuery para agregar funcionalidad asรญncrona (para que la pรกgina no se actualice). Hay un bรกsico etiqueta sin atributo de mรฉtodo (que explicaremos en un momento) y con un curioso atributo de acciรณn con el valor {{route('process')}}. En Blade, esto es lo que se conoce como una Directiva. Una directiva es simplemente un nombre elegante para una funciรณn; son funciones especรญficas de las plantillas Blade que realizan diferentes operaciones comunes a la construcciรณn de pรกginas web y aplicaciones web. Para comprender mejor todas las funcionalidades รบtiles de Blade, consulta la documentaciรณn. aquรญ. En el caso anterior, estamos utilizando la directiva de ruta para generar un URL para el envรญo de nuestro formulario.

Recuerda que definimos nuestras rutas anteriormente en la aplicaciรณn dentro del archivo web.php, especificando un nombre fรกcil de recordar para cada una de ellas. La directiva {{route()}} acepta el nombre de una ruta, la busca dentro de la lista de rutas almacenada en cachรฉ internamente y genera una ruta completa. URL basado en la definiciรณn de esa ruta en el archivo web.php. Para este primer caso, estamos especificando que queremos que el formulario envรญe sus datos enviados a /process. URL de nuestra aplicaciรณn, que se define como una PUBLICAR ruta.

Lo siguiente que quizรกs hayas notado es la etiqueta @csrf justo debajo de la etiqueta de apertura del formulario. En Blade, esta etiqueta genera un parรกmetro _token en el formulario, que se verifica dentro de la aplicaciรณn antes de que se permita procesar los datos del formulario. Esto garantiza que los datos dentro del formulario sean de un origen vรกlido y previene ataques de falsificaciรณn de solicitudes entre sitios. Para obtener mรกs informaciรณn sobre esto, consulta la documentos.

Despuรฉs de esto definimos nuestro formulario como de costumbre; sin embargo, tenga en cuenta que los nombres de los parรกmetros de nuestro formulario, userFile y fileName, son los exactamente el mismo tal como se define dentro de nuestro objeto de solicitud. Si olvidamos incluir una entrada para un parรกmetro determinado que se definiรณ en el objeto de solicitud (o lo escribimos mal), la solicitud fallarรก y se devolverรก un error, impidiendo que la solicitud del formulario original llegue al mรฉtodo del controlador ubicado en UploadController@process.

Anรญmate a probarlo y envรญa algunos archivos a la aplicaciรณn usando este formulario. Despuรฉs, navega a la /lista pรกgina para ver el contenido de la carpeta de carga, con los archivos que cargรณ enumerados en una tabla:

La plantilla de la hoja

The Bigger Picture

Demos un paso atrรกs y analicemos lo que hemos hecho en este tutorial de Laravel.

Este diagrama representa la aplicaciรณn tal como se encuentra actualmente (sin incluir detalles de alto nivel):

Diagrama del tutorial de Laravel

Recuerda que el objeto de solicitud que creamos al principio de este tutorial de Laravel debe tener los mismos parรกmetros definidos en su mรฉtodo rules que los del formulario en la plantilla blade (si no es asรญ, vuelve a leer la secciรณn "Creaciรณn de la lรณgica de validaciรณn"). El usuario introduce el formulario en una pรกgina web renderizada mediante el motor de plantillas blade y lo envรญa. El cรณdigo jQuery de la plantilla, en la parte inferior, detiene el envรญo predeterminado (que redirigirรญa automรกticamente a una pรกgina aparte), crea una solicitud AJAX, carga la solicitud con los datos del formulario y el archivo subido, y envรญa todo a la primera capa de nuestra aplicaciรณn: la solicitud.

El objeto de solicitud se rellena asociando los parรกmetros del mรฉtodo rules() con los parรกmetros del formulario enviado, y luego se validan los datos segรบn cada regla especificada. Si se cumplen todas las reglas, la solicitud se pasa al mรฉtodo del controlador que corresponda a los valores definidos en el archivo de ruta web.php. En este caso, es el mรฉtodo process() del UploadController el que realiza el trabajo. Una vez que llegamos al controlador, ya sabemos que la solicitud ha pasado la validaciรณn, por lo que no es necesario volver a comprobar si el nombre de archivo proporcionado es, de hecho, una cadena o si el parรกmetro userFile contiene algรบn tipo de archivo. Podemos continuar con normalidad.

El mรฉtodo del controlador obtiene los parรกmetros validados del objeto de solicitud, genera un nombre de archivo completo concatenando el parรกmetro `fileName` con la extensiรณn original del archivo del usuario, guarda el archivo en un directorio de la aplicaciรณn y devuelve una respuesta simple codificada en JSON que verifica que la solicitud fue exitosa. La lรณgica de jQuery recibe la respuesta y realiza algunas tareas adicionales relacionadas con la interfaz de usuario, como mostrar el mensaje de รฉxito (o error) durante 5 segundos y luego ocultarlo, ademรกs de borrar las entradas anteriores del formulario. De esta manera, el usuario sabe con certeza que la solicitud fue exitosa y puede cargar otro archivo si lo desea.

Ademรกs, observe en el diagrama anterior dรณnde se traza la lรญnea divisoria entre el cliente y el servidor. Este concepto es fundamental para su comprensiรณn y le ayudarรก a resolver problemas futuros al gestionar, por ejemplo, mรบltiples solicitudes asรญncronas que pueden ocurrir simultรกneamente. La separaciรณn se encuentra justo en el lรญmite del objeto de solicitud. Este objeto puede considerarse como la puerta de entrada al resto de la aplicaciรณn. Realiza la validaciรณn inicial y el registro de los valores del formulario recibidos desde el navegador web. Si se consideran vรกlidos, continรบa hacia el controlador. Todo lo anterior se encuentra en el front-end (el tรฉrmino "cliente" se refiere literalmente al ordenador del usuario). La respuesta se devuelve desde la aplicaciรณn al lado del cliente, donde nuestro cรณdigo jQuery la espera pacientemente y realiza algunas tareas sencillas de interfaz de usuario una vez recibida.

Tambiรฉn hemos abordado muchas preguntas frecuentes importantes. Preguntas de entrevista relacionadas con Laravel y PHP para que los candidatos nuevos y experimentados consigan el trabajo adecuado.

Preguntas Frecuentes

Eloquent es el mapeador objeto-relacional integrado de Laravel. Cada tabla de la base de datos se asigna a una clase de modelo, por lo que se leen y escriben filas como objetos PHP, por ejemplo User::find(1), en lugar de escribir SQL puro para operaciones comunes.

Artisan es la herramienta de lรญnea de comandos de Laravel. Genera cรณdigo con comandos como make:controller y make:request, ejecuta migraciones, borra cachรฉs e inicia un servidor local con php artisan serve, lo que acelera las tareas de desarrollo comunes.

El middleware es una capa que inspecciona o filtra las solicitudes HTTP antes de que lleguen a una ruta, asรญ como las respuestas en su salida. Gestiona aspectos transversales como la autenticaciรณn, la protecciรณn CSRF y el registro de eventos, aplicรกndose por ruta o grupo.

Sรญ. Describe tu modelo y campos, y la IA podrรก generar la migraciรณn, el modelo Eloquent, el controlador, las solicitudes de formulario, las rutas y las vistas Blade siguiendo las convenciones de Laravel. RevRevisa las reglas de validaciรณn y ejecuta las pruebas antes del envรญo.ping.

Sรญ. La IA puede identificar mรฉtodos obsoletos, cambios en la configuraciรณn y los espacios de nombres, y requisitos de paquetes actualizados, para luego guiar la actualizaciรณn versiรณn por versiรณn. Dado que el salto es grande, actualice de forma incremental y realice pruebas despuรฉs de cada paso.

Resumir este post con: