Laravel: Framework PHP Moderno
Laravel es el framework PHP más popular del mundo. Ofrece routing expresivo, Eloquent ORM (modelos ActiveRecord que mapean tablas), Blade (motor de plantillas), migraciones de base de datos, autenticación integrada, colas de trabajo, y Service Container (inyección de dependencias automática). composer create-project laravel/laravel mi-app crea un proyecto completo listo para producción.
Eloquent ORM es el corazón de Laravel para datos. Cada tabla tiene un Modelo: class Producto extends Model {}. Eloquent genera el SQL automáticamente: Producto::where("precio", "<", 100)->orderBy("nombre")->get() ejecuta SELECT * FROM productos WHERE precio < 100 ORDER BY nombre. Las relaciones se definen con métodos: hasMany, belongsTo, belongsToMany. Las migraciones versionan la estructura de la DB en PHP, permitiendo migrar y revertir cambios con artisan.
<?php
// --- Routing (routes/web.php) ---
Route::get("/productos", [ProductoController::class, "index"]);
Route::post("/productos", [ProductoController::class, "store"]);
Route::get("/productos/{id}", [ProductoController::class, "show"]);
// --- Modelo Eloquent (app/Models/Producto.php) ---
class Producto extends Model {
protected $fillable = ["nombre", "precio", "categoria_id"];
// Relación: un producto pertenece a una categoría
public function categoria() {
return $this->belongsTo(Categoria::class);
}
}
class Categoria extends Model {
public function productos() {
return $this->hasMany(Producto::class);
}
}
// --- Controller (app/Http/Controllers/ProductoController.php) ---
class ProductoController extends Controller {
public function index(Request $request) {
$productos = Producto::with("categoria") // Eager loading
->when($request->buscar, fn($q, $s) =>
$q->where("nombre", "like", "%{$s}%")
)
->orderBy("created_at", "desc")
->paginate(20);
return view("productos.index", compact("productos"));
}
public function store(Request $request) {
$validated = $request->validate([
"nombre" => "required|string|max:255",
"precio" => "required|numeric|min:0",
"categoria_id" => "required|exists:categorias,id",
]);
Producto::create($validated);
return redirect("/productos")->with("exito", "Producto creado");
}
}
// --- Migración (database/migrations/..._create_productos.php) ---
// php artisan make:migration create_productos_table
return new class extends Migration {
public function up(): void {
Schema::create("productos", function (Blueprint $table) {
$table->id();
$table->string("nombre");
$table->decimal("precio", 10, 2);
$table->foreignId("categoria_id")->constrained();
$table->timestamps(); // created_at, updated_at
});
}
};
// php artisan migrate — aplica la migración
Practica esta lección
Resuelve los ejercicios del curso de PHP en la app, gratis y con corrección automática.
Empezar a practicar