Aunque han pasado unos días desde que en febrero se lanzó Laravel 12 (tal como anunciamos en nuestro anterior post), hemos querido hacer un repaso especial a las novedades que esta nueva versión nos presenta. Para ello, además de mostrarte las principales mejoras, te presentamos un caso de uso realista en el que hemos aplicado las nuevas funcionalidades. Esta guía de Laravel 12 te ayudará a comprender mejor las nuevas características y cómo aplicarlas en tu próximo proyecto.
¿Quieres ver el anuncio oficial? Puedes consultar la noticia del lanzamiento de Laravel 12 aquí.
Novedades principales de Laravel 12
Laravel 12 trae principalmente mejoras incrementales que facilitan el trabajo diario de los desarrolladores:
- Uso de UUID v7 como identificadores únicos ordenados cronológicamente.
- Nuevo método nestedWhere() en el Query Builder para simplificar consultas complejas.
- Validación mejorada de archivos, especialmente restringiendo imágenes SVG por defecto.
- Ejecución paralela optimizada usando
Concurrency::run()
manteniendo claves asociativas. - Colecciones con saltos en range(), permitiendo definir pasos personalizados.
- Starter Kits renovados con autenticación avanzada lista para usar.
Todo esto se explica con ejemplos en esta guía Laravel 12, pensada para que puedas aplicarlo fácilmente en tus proyectos.
Caso de uso: Aplicación «Gestor de Tareas» usando Laravel 12
Instalación del proyecto
composer create-project laravel/laravel:^12.0 gestor-tareas npm install && npm run dev php artisan migrate php artisan storage:link
Migración para tareas
// database/migrations/create_tasks_table.php public function up() { Schema::create('tasks', function (Blueprint $table) { $table->uuid('id')->primary(); // UUID v7 por defecto en Laravel 12 $table->foreignId('user_id')->constrained()->cascadeOnDelete(); $table->string('titulo'); $table->text('descripcion')->nullable(); $table->string('imagen_path')->nullable(); $table->timestamps(); }); }
La columna id
usa UUID v7 automáticamente gracias al trait HasUuids
, como te sugerimos en esta guía de Laravel 12.
Modelo Task
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Concerns\HasUuids; class Task extends Model { use HasUuids; protected $fillable = ['titulo', 'descripcion', 'imagen_path', 'user_id']; public function user() { return $this->belongsTo(User::class); } }
Aquí el trait HasUuids
garantiza que cada tarea creada tenga automáticamente su UUID v7 único.
Controlador de tareas
class TaskController extends Controller { public function __construct() { $this->middleware('auth'); } public function index() { $tareas = Task::where('user_id', auth()->id())->latest()->get(); return view('tasks.index', compact('tareas')); } public function store(Request $request) { $request->validate([ 'titulo' => 'required|string|max:255', 'descripcion'=> 'nullable|string', 'imagen'=> ['nullable', File::image()] // No permite SVG por defecto ]); $request->mergeIfMissing(['descripcion' => '']); $datos = $request->only(['titulo', 'descripcion']); if ($request->hasFile('imagen')) { $datos['imagen_path'] = $request->file('imagen')->store('imagenes', 'public'); } $datos['user_id'] = Auth::id(); Task::create($datos); return redirect()->route('tasks.index')->with('success', 'Tarea creada.'); } }
Aquí ves validación avanzada (sin SVG), asignación automática del usuario autenticado y el uso del método mergeIfMissing()
.
Uso del método nestedWhere() en Laravel 12
¿Quieres consultas más limpias? Ahora es más fácil:
$tareasImportantes = Task::nestedWhere( 'prioridad', '=', 'alta', 'or', 'fecha_limite', '<', now()->addDays(7) )->get();
Con nestedWhere()
puedes combinar condiciones de forma sencilla y ordenada, tal como te proponemos en esta guía de Laravel 12.
Comando para ejecutar tareas concurrentes en Laravel 12
class ComputeStats extends Command { protected $signature = 'compute:stats'; public function handle() { $resultados = Concurrency::run([ 'conteo_tareas' => fn() => DB::table('tasks')->count(), 'calculo_matematico' => fn() => array_sum(range(1, 1000000)), ]); foreach ($resultados as $clave => $valor) { $this->info("{$clave}: {$valor}"); } } }
Esta nueva ejecución paralela en Laravel 12 es muy útil para tareas pesadas o procesos simultáneos.
Método range() mejorado en colecciones
Ahora puedes generar rangos personalizados fácilmente:
$numeros = Collection::range(1, 10, 2)->all(); // [1,3,5,7,9]
Otra pequeña joya que facilita el día a día, como detallamos en esta guía Laravel 12.
Prueba unitaria usando Pest PHP v3
use App\Models\Task; use App\Models\User; test('crear tarea genera UUID v7', function () { $user = User::factory()->create(); $this->actingAs($user); $this->post('/tasks', ['titulo' => 'Ejemplo']); $tarea = Task::first(); expect($tarea->id)->toBeUuid(); });
Así puedes comprobar fácilmente que tus tareas se están creando correctamente con UUID v7.
Cómo ejecutar el proyecto localmente
Sigue estos pasos:
composer install npm install && npm run dev php artisan migrate php artisan storage:link php artisan serve
Y para probar el comando concurrente:
php artisan compute:stats
Así de sencillo gracias a las mejoras de Laravel 12 que te hemos resumido en esta guía.
¿Te ha gustado esta guía Laravel 12?
Si quieres profundizar aún más, no te pierdas la documentación oficial de Laravel 12.