Introducción a Frameworks PHP. A medida que desarrollamos aplicaciones más completas con PHP es común que el código comience a crecer en extensión y complejidad. Esto puede generar dificultades para organizar los archivos, estructurar la lógica de la aplicación, reutilizar funciones, es por este motivo por el que tienen gran importancia lo frameworks de PHP.
En este capítulo haremos una pequeña introdución para que conozcas lo que son los framework y por qué deberías utilizarlos en tus proyectos. Veremos cómo estas herramientas ayudan a aplicar principios como el MVC (Modelo-Vista-Controlador), el enrutamiento, la gestión de dependencias, etc..
Nos enfocaremos en dos de los frameworks más populares y utilizados en la actualidad:
- Laravel, conocido por su elegancia, sintaxis expresiva y enorme ecosistema de herramientas.
- CodeIgniter, porpular por su ligereza y facilidad de uso.
También aprenderás cómo iniciar un proyecto básico con Laravel, configurarlo paso a paso y comprender la estructura de carpetas y archivos que utiliza este framework moderno.
12.1 ¿Qué es un framework y por qué usarlo?
¿Qué es un framework?
Un framework es un conjunto de herramientas, librerías y convenciones predefinidas que nos ayuda a construir aplicaciones de forma más rápida, ordenada y segura. Nos permite trabajar sobre una arquitectura estructurada, facilita la separación de responsabilidades, y nos ofrece soluciones integradas para tareas comunes como el manejo de rutas, el acceso a bases de datos, la validación de formularios o la autenticación de usuarios.
En lugar de construir una aplicación desde cero, un framework proporciona una serie de componentes ya preparados que nos ayudan a resolver tareas comunes como:
- Gestión de rutas y URLs
- Conexión y consulta a bases de datos
- Manejo de sesiones y cookies
- Validación y saneamiento de datos
- Autenticación de usuarios
- Generación de vistas (plantillas HTML)
- Seguridad contra ataques (como inyección SQL o CSRF)
- etc.
El uso de un framework nos obliga (en el buen sentido) a seguir ciertas reglas y estructuras que facilitan la colaboración entre desarrolladores, el mantenimiento del código a largo plazo y la escalabilidad de nuestros proyectos.
¿Por qué usar un framework?
Aunque es totalmente posible desarrollar aplicaciones únicamente con PHP «puro» (sin ningún framework), conforme un proyecto crece, surgen varios desafíos:
- Desorganización del código: cuando se mezclan funciones, lógica y diseño sin una estructura clara.
- Duplicación de código: funciones similares se escriben una y otra vez.
- Dificultad para mantener o escalar la aplicación: añadir nuevas funcionalidades se vuelve complejo.
- Problemas de seguridad: al no aplicar buenas prácticas de forma sistemática.
Un framework ayuda a resolver todos estos problemas gracias a sus características:
Ventaja del uso de un framework | Descripción |
---|---|
Estructura clara y organizada | El código se divide en carpetas según su responsabilidad: modelos, vistas, controladores, etc. |
Seguridad incorporada | Muchos frameworks ya traen protección contra ataques comunes como inyección SQL o XSS. |
Mayor velocidad de desarrollo | Tareas comunes ya están resueltas, como la autenticación, formularios, validación, etc. |
Reutilización de código | Al tener clases reutilizables y configuraciones centralizadas, se reduce la duplicación. |
Pruebas y mantenimiento | La estructura facilita escribir pruebas automatizadas y mantener el código ordenado. |
Trabajo en equipo más efectivo | Al usar convenciones comunes, varios desarrolladores pueden colaborar fácilmente. |
Frameworks vs. Librerías
Es importante distinguir entre frameworks y librerías:
- Una librería es un conjunto de funciones que tú decides cuándo y cómo usar dentro de tu aplicación.
- Un framework, en cambio, marca las reglas: tú trabajas dentro de su estructura definida por el framework, siguiendo su flujo y sus convenciones.
Una frase común para explicarlo es:
Con una librería tú llamas al código. Con un framework, es el framework quien llama al tuyo.
Ejemplo simple
Imaginemos que queremos crear una página que muestre una lista de usuarios desde una base de datos.
Con PHP puro:
- Tendrías que crear la conexión a la base de datos manualmente.
- Escribir tú mismo las sentencias SQL.
- Manejar errores y sanitizar entradas.
- Crear tu estructura de carpetas, plantillas y rutas.
Con un framework (como Laravel o CodeIgniter):
- Usas una clase ya preparada para la conexión.
- La estructura de carpetas ya está definida.
- El framework valida automáticamente la entrada del usuario.
- Puedes usar una interfaz ORM (Object Relational Mapping o Mapeo Objeto-Relacional) para escribir consultas de forma más limpia.
Algunos frameworks populares en PHP
Framework | Descripción breve |
---|---|
Laravel | Uno de los frameworks más populares. Muy completo, moderno, y con una curva de aprendizaje amigable. |
Symfony | Muy robusto y flexible, ideal para aplicaciones complejas y grandes. |
CodeIgniter | Ligero y sencillo, recomendado para quienes inician en frameworks. |
Yii | Potente y de alto rendimiento, especialmente útil para aplicaciones rápidas. |
Slim | Microframework para crear APIs y aplicaciones pequeñas con rapidez. |
12.2 Introducción a Laravel y CodeIgniter
En el ecosistema de frameworks PHP, Laravel y CodeIgniter destacan como dos de los más utilizados y valorados por la comunidad. Cada uno tiene sus fortalezas y características particulares que los hacen adecuados para diferentes tipos de proyectos. A continuación, exploraremos cada uno por separado.
¿Qué es Laravel?
Laravel es un framework de desarrollo web en PHP de código abierto, creado por Taylor Otwell en 2011. Está diseñado para ayudar a los desarrolladores a construir aplicaciones web de manera eficiente, limpia y elegante, siguiendo el patrón arquitectónico MVC (Modelo-Vista-Controlador).
Laravel ha crecido hasta convertirse en el framework PHP más popular del mundo gracias a su:
- Sintaxis clara y expresiva.
- Herramientas integradas para tareas comunes.
- Excelente documentación.
- Gran comunidad de soporte.
Filosofía de Laravel
Laravel se enfoca en proporcionar una experiencia de desarrollo sencilla y productiva. Su lema es:
“The PHP Framework For Web Artisans”
Esto significa que Laravel está diseñado para los artesanos del código, aquellos que quieren escribir código limpio, legible y mantenible.
Algunas de sus metas clave:
- Fomentar el uso de buenas prácticas (DRY, SOLID, etc.).
- Facilitar el desarrollo rápido con herramientas integradas.
- Promover una arquitectura limpia y desacoplada.
Arquitectura MVC en Laravel
Laravel está estructurado siguiendo el patrón MVC, lo cual permite separar claramente las responsabilidades de la aplicación:
Componente | Descripción | Archivos típicos |
---|---|---|
Modelo (Model) | Representa los datos y la lógica del negocio. | app/Models/Producto.php |
Vista (View) | Se encarga de la presentación (HTML/Blade). | resources/views/productos/index.blade.php |
Controlador (Controller) | Procesa las peticiones, maneja la lógica y devuelve respuestas. | app/Http/Controllers/ProductoController.php |
Herramientas y Componentes Clave de Laravel
Laravel incluye una gran variedad de módulos integrados que facilitan el desarrollo. A continuación, te explico los principales:
– Routing (Sistema de rutas)
Laravel tiene un sistema de rutas muy potente. Puedes definir una URL y asociarla a una función o controlador.
// routes/web.php
Route::get('/saludo', function () {
return 'Hola Mundo desde Laravel';
});
O bien usar un controlador:
Route::get('/productos', [ProductoController::class, 'index']);
– Controladores
Los controladores organizan la lógica del sistema. Puedes generarlos con Artisan:
artisan make:controller ProductoController
// ProductoController.php
public function index() {
$productos = Producto::all();
return view('productos.index', compact('productos'));
}
– Blade: Motor de plantillas
Laravel incluye Blade, su propio motor de plantillas, que te permite usar estructuras de control en vistas sin mezclar PHP puro con HTML.
<!-- resources/views/productos/index.blade.php -->
@foreach ($productos as $producto)
<p>{{ $producto->nombre }} - ${{ $producto->precio }}</p>
@endforeach
Blade también soporta layouts, componentes reutilizables y slots.
– ORM Eloquent
Laravel incluye un ORM llamado Eloquent, que te permite trabajar con la base de datos usando modelos orientados a objetos.
// app/Models/Producto.php
class Producto extends Model {
protected $fillable = ['nombre', 'precio'];
}
// Uso en controlador
$productos = Producto::where('categoria', 'Electrónica')->get();
– Migrations (Migraciones)
Las migraciones permiten definir la estructura de la base de datos en código PHP.
artisan make:migration create_productos_table
Schema::create('productos', function (Blueprint $table) {
$table->id();
$table->string('nombre');
$table->decimal('precio', 8, 2);
$table->timestamps();
});
Con php artisan migrate
aplicas la estructura a tu base de datos.
– Artisan: Consola de comandos
Artisan es la línea de comandos integrada de Laravel, útil para generar código y administrar el proyecto.
artisan make:model Producto
php artisan migrate
php artisan serve
– Middleware
Laravel permite usar middleware para filtrar solicitudes HTTP (como autenticación o protección CSRF).
// web.php
Route::middleware(['auth'])->group(function () {
Route::get('/dashboard', function () {
return view('dashboard');
});
});
– Validación
Laravel permite validar formularios fácilmente:
$request->validate([
'nombre' => 'required|max:255',
'precio' => 'required|numeric',
]);
– Autenticación y autorización
Laravel incluye sistemas completos de login, registro, recuperación de contraseña, y roles/permiso mediante paquetes como Laravel Breeze, Jetstream o Laravel UI.
Estructura de un Proyecto Laravel
Un proyecto Laravel contiene carpetas organizadas con funciones específicas:
Carpeta | Descripción |
---|---|
app/Models | Modelos Eloquent |
app/Http/Controllers | Controladores |
resources/views | Vistas Blade |
routes/web.php | Definición de rutas web |
database/migrations | Migraciones |
public/ | Carpeta pública para archivos accesibles por el navegador |
config/ | Archivos de configuración |
.env | Variables de entorno (configuración del entorno, DB, mail, etc.) |
Ventajas de Usar Laravel
Ventaja | Descripción |
---|---|
Productividad alta | Artisan, Blade, Eloquent y otras herramientas permiten desarrollar más rápido. |
Buenas prácticas integradas | Facilita el uso de MVC, inyección de dependencias, separación de capas. |
Seguridad | Incluye protección contra CSRF, XSS, SQL Injection. |
Comunidad activa | Miles de tutoriales, paquetes, foros y ayuda disponible. |
Pruebas integradas | Herramientas para testing automático con PHPUnit. |
APIs modernas | Ideal para crear APIs RESTful fácilmente. |
Ecosistema Laravel | Puedes añadir paquetes como Laravel Nova (admin), Horizon (colas), Sanctum (API tokens), etc. |
Ejemplo Práctico: CRUD básico con Laravel
Modelo:
artisan make:model Producto -m
Migración:
Schema::create('productos', function (Blueprint $table) {
$table->id();
$table->string('nombre');
$table->decimal('precio', 8, 2);
$table->timestamps();
});
Controlador:
artisan make:controller ProductoController --resource
Ruta:
Route::resource('productos', ProductoController::class);
Vista (Blade):
@foreach ($productos as $producto)
<p>{{ $producto->nombre }} - ${{ $producto->precio }}</p>
@endforeach
Con estas líneas, puedes tener un CRUD funcional con Laravel.🧠 Conclusión
Como has podido ver, Laravel no es solo un framework, es un ecosistema completo para construir aplicaciones PHP. Proporciona una estructura robusta con una gran cantidad de herramientas integradas. Es ideal tanto para desarrolladores novatos como para profesionales que necesitan construir aplicaciones escalables, seguras y limpias.
CodeIgniter.
¿Qué es CodeIgniter?
CodeIgniter es un framework de desarrollo web para PHP, rápido, ligero y con una estructura sencilla, basado tambiénen el patrón MVC (Modelo-Vista-Controlador). Fue creado originalmente por EllisLab y actualmente está mantenido por el equipo de British Columbia Institute of Technology (BCIT).
Su objetivo principal es permitir el desarrollo de aplicaciones PHP con el mínimo de configuración, ofreciendo alto rendimiento y una curva de aprendizaje baja, ideal para quienes comienzan con frameworks o vienen de escribir PHP puro.
Filosofía de CodeIgniter
A diferencia de otros frameworks más pesados o complejos, CodeIgniter busca ser minimalista y flexible, sin imponer demasiadas reglas. Se basa en los siguientes principios:
- Simplicidad sobre complejidad
- Ligereza sobre extensividad
- Alto rendimiento
- Configuración mínima
- Documentación clara y completa
No requiere usar Composer, líneas de comandos o configuración compleja. Es posible descargarlo, descomprimirlo y empezar a usarlo en pocos minutos.
Características Clave
Característica | Descripción |
---|---|
MVC estructurado | Facilita la organización del código en capas: modelo, vista, controlador |
Rápido y ligero | Uno de los frameworks más veloces y livianos de PHP |
Configuración mínima | No necesita un entorno complejo ni uso obligatorio de línea de comandos |
Modular | Posibilidad de cargar solo las librerías necesarias |
Seguridad integrada | Soporte para XSS, CSRF y filtrado de datos |
Excelente documentación | Documentación clara, concisa y bien organizada |
Estructura MVC en CodeIgniter
Como ya hemos comentado, CodeIgniter sigue el patrón Modelo-Vista-Controlador, con una estructura muy clara:
- Modelos → Interactúan con la base de datos.
- Vistas → Se encargan del diseño y la presentación.
- Controladores → Coordinan lógica y flujo entre modelos y vistas.
// Modelo: app/Models/ProductoModel.php
class ProductoModel extends \CodeIgniter\Model {
protected $table = 'productos';
protected $allowedFields = ['nombre', 'precio'];
}
// Controlador: app/Controllers/Producto.php
class Producto extends \CodeIgniter\Controller {
public function index() {
$model = new \App\Models\ProductoModel();
$data['productos'] = $model->findAll();
return view('productos', $data);
}
}
// Vista: app/Views/productos.php
<?php foreach($productos as $p): ?>
<p><?= $p['nombre']; ?> - $<?= $p['precio']; ?></p>
<?php endforeach; ?>
Estructura de Carpetas
La estructura típica de un proyecto CodeIgniter 4 es:
/app
/Controllers
/Models
/Views
/public
/system
/writable
.env
app/
→ Código de la aplicación.public/
→ Document root del servidor (similar apublic_html
).system/
→ Núcleo del framework.writable/
→ Carpeta para logs, caché, etc..env
→ Variables de entorno.
Routing en CodeIgniter
Las rutas pueden definirse en el archivo app/Config/Routes.php
:
$routes->get('/', 'Home::index');
$routes->get('/productos', 'Producto::index');
También puede usarse el enrutamiento automático (por convención controlador/metodo
).
Carga de modelos y librerías
En CodeIgniter puedes cargar modelos directamente dentro de los controladores:
$model = new \App\Models\ProductoModel();
También puedes usar servicios y helpers con funciones como:
helper('form');
$session = \Config\Services::session();
Modelo y acceso a base de datos con CodeIgniter
CodeIgniter tiene su propio ORM ligero (aunque no tan avanzado como Eloquent). Permite hacer operaciones fácilmente:
$model = new ProductoModel();
// Obtener todos los productos
$productos = $model->findAll();
// Insertar nuevo
$model->save(['nombre' => 'Ratón', 'precio' => 25.99]);
// Actualizar
$model->update(1, ['precio' => 27.50]);
// Eliminar
$model->delete(1);
Seguridad en CodeIgniter
CodeIgniter ofrece herramientas integradas para proteger tu aplicación:
Seguridad | Soporte |
---|---|
CSRF | Activado por defecto |
XSS | Mediante funciones de escape |
Validación | Incorporada en formularios |
Filtrado de entrada | Input sanitization y filtros integrados |
Ejemplo de protección CSRF en formularios:
<?= csrf_field() ?>
<input type="text" name="nombre">
Validación de formularios
CodeIgniter tiene validación incorporada muy fácil de usar:
$validation = \Config\Services::validation();
$rules = [
'nombre' => 'required|min_length[3]',
'precio' => 'required|decimal'
];
if (! $this->validate($rules)) {
echo $validation->listErrors();
} else {
$model->save($this->request->getPost());
}
CLI (Interfaz de línea de comandos)
CodeIgniter 4 incluye una herramienta CLI opcional similar a Artisan de Laravel:
php spark serve
php spark make:controller Producto
php spark make:model ProductoModel
Esto facilita tareas de desarrollo, migraciones, y pruebas.
Migraciones
CodeIgniter 4 permite usar migraciones para gestionar la estructura de la base de datos:
php spark make:migration CreateProductosTable
Archivo de migración:
public function up() {
$this->forge->addField([
'id' => ['type' => 'INT', 'auto_increment' => true],
'nombre' => ['type' => 'VARCHAR', 'constraint' => 100],
'precio' => ['type' => 'DECIMAL', 'constraint' => '8,2'],
]);
$this->forge->addKey('id', true);
$this->forge->createTable('productos');
}
Ventajas de CodeIgniter
Ventaja | Descripción |
---|---|
Muy rápido | De los frameworks más ligeros y rápidos en ejecución |
Instalación sencilla | No requiere Composer ni CLI obligatorio |
Curva de aprendizaje baja | Ideal para quienes migran de PHP puro |
Flexible | No impone estructuras rígidas |
Modular | Solo cargas lo que necesitas |
Documentación clara | Fácil de entender, bien explicada |
Diferencias clave con Laravel
Comparativa | Laravel | CodeIgniter |
---|---|---|
Filosofía | «Código elegante y expresivo» | «Ligero, sencillo y rápido» |
Complejidad | Alta (más funciones) | Baja (más directo) |
ORM | Eloquent (avanzado) | ORM básico |
Motor de plantillas | Blade | PHP puro |
CLI | Artisan | Spark (opcional) |
Curva de aprendizaje | Media/Alta | Baja |
Ecosistema | Muy amplio | Más limitado |
Resumiendo, CodeIgniter es un framework excelente si:
- Buscas rendimiento y sencillez.
- Eres principiante y quieres una entrada suave al desarrollo moderno.
- Tienes aplicaciones pequeñas o medianas que no necesitan toda la complejidad de Laravel.
Su enfoque minimalista, curva de aprendizaje baja y buena documentación lo hacen ideal para desarrolladores que buscan velocidad y control.
12.3 Proyecto Básico con Laravel
Objetivo
Vamos a crear una pequeña aplicación Laravel llamada “Gestor de Productos”, que permitirá:
- Mostrar un listado de productos.
- Crear nuevos productos.
- Eliminar productos.
Usaremos Laravel 10 o superior, Eloquent ORM, el motor de plantillas Blade, migraciones, rutas, controladores y formularios.
Requisitos Previos
Asegúrate de tener instalado:
- PHP 8.x
- Composer
- Laravel (opcionalmente el instalador global:
composer global require laravel/installer
) - MySQL o MariaDB
- Un entorno como XAMPP, Laragon o Laravel Sail
1º Crear un nuevo proyecto
composer create-project laravel/laravel gestor_productos
cd gestor_productos
Si usas Laravel Sail (Docker), puedes inicializarlo con:
php artisan sail:install
./vendor/bin/sail up
2º Configurar la base de datos
Edita el archivo .env
:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=gestor
DB_USERNAME=root
DB_PASSWORD=tu_clave
Crea la base de datos vacía gestor
desde MySQL.
3º Crear la migración y el modelo
Generamos el modelo Producto
junto con su migración:
php artisan make:model Producto -m
Edita el archivo de migración en database/migrations/xxxx_create_productos_table.php
:
public function up()
{
Schema::create('productos', function (Blueprint $table) {
$table->id();
$table->string('nombre');
$table->decimal('precio', 8, 2);
$table->timestamps();
});
}
Aplica la migración:
php artisan migrate
4º Crear el controlador
php artisan make:controller ProductoController
Editamos app/Http/Controllers/ProductoController.php
:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Producto;
class ProductoController extends Controller
{
public function index()
{
$productos = Producto::all();
return view('productos.index', compact('productos'));
}
public function create()
{
return view('productos.create');
}
public function store(Request $request)
{
$request->validate([
'nombre' => 'required|min:3',
'precio' => 'required|numeric',
]);
Producto::create($request->all());
return redirect()->route('productos.index')->with('success', 'Producto añadido.');
}
public function destroy(Producto $producto)
{
$producto->delete();
return redirect()->route('productos.index')->with('success', 'Producto eliminado.');
}
}
5º Definir rutas
Editamos routes/web.php
:
use App\Http\Controllers\ProductoController;
Route::get('/', [ProductoController::class, 'index'])->name('productos.index');
Route::get('/productos/crear', [ProductoController::class, 'create'])->name('productos.create');
Route::post('/productos', [ProductoController::class, 'store'])->name('productos.store');
Route::delete('/productos/{producto}', [ProductoController::class, 'destroy'])->name('productos.destroy');
6º Habilitar asignación masiva en el modelo
En app/Models/Producto.php
:
protected $fillable = ['nombre', 'precio'];
7º Crear las vistas Blade
resources/views/productos/index.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Productos</title>
</head>
<body>
<h1>Listado de productos</h1>
@if(session('success'))
<p>{{ session('success') }}</p>
@endif
<a href="{{ route('productos.create') }}">Añadir nuevo producto</a>
<ul>
@foreach ($productos as $producto)
<li>
{{ $producto->nombre }} - ${{ $producto->precio }}
<form action="{{ route('productos.destroy', $producto) }}" method="POST" style="display:inline;">
@csrf
@method('DELETE')
<button type="submit">Eliminar</button>
</form>
</li>
@endforeach
</ul>
</body>
</html>
resources/views/productos/create.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Nuevo Producto</title>
</head>
<body>
<h1>Añadir nuevo producto</h1>
@if ($errors->any())
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
<form method="POST" action="{{ route('productos.store') }}">
@csrf
<label>Nombre:</label>
<input type="text" name="nombre"><br>
<label>Precio:</label>
<input type="text" name="precio"><br>
<button type="submit">Guardar</button>
</form>
<a href="{{ route('productos.index') }}">Volver</a>
</body>
</html>
Prueba la aplicación
- Inicia el servidor de Laravel:
php artisan serve
- Ve a
http://localhost:8000
en tu navegador.
Podrás añadir productos, verlos listados y eliminarlos. Esta pequeña aplicación básica demuestra cómo Laravel gestiona MVC, formularios, validación, Eloquent, vistas Blade, y rutas.
Resumiendo.
Con este proyecto:
- Hemos visto cómo se estructura una aplicación Laravel.
- Hemos creado el conjunto de operaciones CRUD básico de productos.
- Hemos usado migraciones, controladores, vistas Blade, validación y rutas.
Este ejemplo puede ampliarse fácilmente con autenticación, edición, filtros, paginación, carga de imágenes, etc.
Bibliografía de programación en PHP.
- Aprende PHP desde Cero: Todo lo que necesitas para programar en PHP. Autor: Gerardo G. Urtiaga (Editorial: Editorior Independiente)
- PHP y MySQL: Domine el desarrollo de un sitio web dinámico e interactivo. Autor: Olivier Heurtel (Editorial: Ediciones ENI)
- PHP 8: Programación de aplicaciones web en el servidor: Guía paso a paso con ejemplos y proyectos prácticos. Autor: Jose Vicente Cerratlá.