Crear y ejecutar un proyecto CodeIgniter
¿Qué es CodeIgniter?
CodeIgniter es un framework de desarrollo web para PHP reconocido por su ligereza y alto rendimiento. Basado en el patrón de diseño Modelo-Vista-Controlador (MVC), está diseñado para ayudar a los desarrolladores a construir aplicaciones web funcionales de manera rápida y eficiente. Gracias a su estructura simple, magnífico desempeño y facilidad de aprendizaje, CodeIgniter es una opción popular entre los desarrolladores PHP.
Principales características y ventajas de CodeIgniter
- Núcleo ligero: El sistema principal de CodeIgniter es muy compacto y solo contiene los componentes esenciales, lo que garantiza una carga ultrarrápida.
- Alto rendimiento: El framework está optimizado para la eficiencia y puede manejar un alto volumen de solicitudes, ofreciendo un rendimiento excepcional.
- Fácil de aprender: Dispone de documentación clara y una API intuitiva, permitiendo a los desarrolladores dominarlo rápidamente.
- Alta flexibilidad: Permite integrar y elegir librerías de terceros libremente según las necesidades del proyecto, facilitando la extensión y personalización.
- Comunidad activa: Posee una gran y activa comunidad de desarrolladores, que proporciona abundantes recursos y soporte.
CodeIgniter es flexible y adaptable a proyectos pequeños y grandes a nivel empresarial, ayudando a los desarrolladores a crear soluciones web de alta calidad y de forma eficiente.
Preparar el entorno de desarrollo con ServBay
ServBay es una herramienta de entorno de desarrollo web local diseñada para macOS. Integra PHP, bases de datos (MySQL, PostgreSQL, MongoDB), servicios de caché (Redis, Memcached), y servidores web (Caddy, Nginx, Apache), junto con una interfaz de gestión conveniente. Con ServBay, puedes configurar y administrar fácilmente el entorno necesario para tus proyectos CodeIgniter.
Esta guía te mostrará cómo utilizar el entorno PHP de ServBay y su función de sitios web para crear, configurar y ejecutar un proyecto CodeIgniter, además de integrar múltiples servicios de bases de datos y caché.
Prerrequisitos
Antes de comenzar, asegúrate de haber cumplido con los siguientes requisitos:
- ServBay está correctamente instalado y en ejecución en tu sistema macOS.
- La versión de PHP que utilizarás (por ejemplo, PHP 8.3) está habilitada en ServBay.
- Los paquetes de base de datos y caché necesarios (por ejemplo, MySQL, PostgreSQL, Redis, Memcached) están activados en ServBay.
Crear un proyecto CodeIgniter
Se recomienda almacenar todos los proyectos web en el directorio /Applications/ServBay/www
para permitir una gestión eficiente de los sitios locales a través de ServBay.
Instalar Composer
ServBay ya incluye Composer durante su instalación, por lo que normalmente no es necesario instalarlo manualmente. Puedes usar directamente el comando
composer
en la terminal.Ingresar al directorio raíz del sitio
Abre la terminal y navega al directorio raíz recomendado:
bashcd /Applications/ServBay/www
1Crear un proyecto CodeIgniter
Usa Composer para generar un nuevo proyecto CodeIgniter 4. Llamaremos al directorio del proyecto
servbay-codeigniter-app
:bashcomposer create-project codeigniter4/appstarter servbay-codeigniter-app
1Composer descargará la estructura base y las dependencias de CodeIgniter en la carpeta
servbay-codeigniter-app
.Entrar al directorio del proyecto
Accede al nuevo directorio del proyecto CodeIgniter:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1
Configuración inicial
Configurar la conexión a la base de datos
La configuración de base de datos de CodeIgniter se encuentra en app/Config/Database.php
. Antes de utilizar cualquier base de datos, debes definir aquí los detalles de la conexión.
Primero, si planeas usar una base de datos, asegúrate de haber creado una base de datos llamada servbay_codeigniter_app
mediante alguna de las herramientas de gestión de ServBay, como Adminer o phpMyAdmin (accesibles desde la interfaz de ServBay).
Luego, edita el archivo app/Config/Database.php
, localiza el array $default
y actualiza los datos de conexión según el tipo de base de datos que hayas activado en ServBay (por ejemplo, MySQL o PostgreSQL). Por defecto, el usuario y contraseña suelen ser root
y password
.
Ejemplo de configuración para MySQL:
public $default = [
'DSN' => '',
'hostname' => '127.0.0.1', // ServBay suele escuchar en 127.0.0.1
'username' => 'root', // Usuario por defecto de ServBay
'password' => 'password', // Contraseña por defecto de ServBay
'database' => 'servbay_codeigniter_app', // Nombre de tu base de datos
'DBDriver' => 'MySQLi', // Para MySQL utiliza MySQLi o Pdo
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8mb4',
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306, // Puerto por defecto MySQL
];
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Si usas PostgreSQL, el valor de DBDriver
debe ser 'Postgre'
, el puerto normalmente será 5432
y podrías necesitar ajustar la configuración de los conjuntos de caracteres.
Configurar conexión de caché (Memcached/Redis)
Si vas a utilizar Memcached o Redis como sistema de caché, deberás modificar el archivo app/Config/Cache.php
.
Edita el archivo app/Config/Cache.php
y localiza la sección correspondiente. En ServBay, Memcached escucha en el puerto 11211
y Redis en 6379
, y generalmente no requieren contraseña.
Ejemplo de configuración para Memcached:
public $memcached = [
'host' => '127.0.0.1', // Memcached de ServBay generalmente escucha en 127.0.0.1
'port' => 11211, // Puerto por defecto de Memcached
'weight' => 1,
];
2
3
4
5
Ejemplo para Redis:
public string $handler = 'redis'; // Establece Redis como manejador de caché predeterminado
public $default = [ // Configuración de Redis dentro del array default
'host' => '127.0.0.1', // Redis escucha en 127.0.0.1
'password' => null, // Por defecto, sin contraseña
'port' => 6379, // Puerto estándar de Redis
'timeout' => 0,
'database' => 0,
];
2
3
4
5
6
7
8
9
Asegúrate de configurar la sección que corresponda con los servicios de caché que hayas activado.
Configurar el servidor web (Configuración de sitios en ServBay)
Usa la función de sitios web de ServBay para indicar al servidor web dónde debe apuntar tu proyecto CodeIgniter.
- Abre la interfaz de ServBay.
- Ve a la pestaña Sitios web (Websites).
- Haz clic en el botón
+
en la esquina inferior izquierda para crear un nuevo sitio web. - Completa la información del sitio:
- Nombre (Name): Escribe un nombre descriptivo, por ejemplo,
Mi primer sitio Dev con CodeIgniter
. - Dominio (Domain): Elige el dominio local por el que accederás, por ejemplo,
servbay-codeigniter-test.local
. ServBay resuelve automáticamente los dominios.local
en local. - Tipo de sitio (Site Type): Selecciona
PHP
. - Versión de PHP (PHP Version): Elige la versión deseada, por ejemplo,
8.3
. - Raíz del sitio (Document Root): Este es un paso clave. El archivo de entrada de CodeIgniter (
index.php
) está en la carpetapublic
dentro de la raíz del proyecto. Por tanto, la raíz del sitio debe apuntar a la carpetapublic
de tu proyecto:/Applications/ServBay/www/servbay-codeigniter-app/public
.
- Nombre (Name): Escribe un nombre descriptivo, por ejemplo,
- Haz clic en Agregar (Add) para guardar los cambios.
- Si ServBay te pide aplicar los cambios, confirma la acción.
Consulta Cómo agregar tu primer sitio web para más detalles.
Agregar código de ejemplo
Para comprobar que tu proyecto funciona y probar las conexiones a la base de datos y caché, modifica el controlador Home
por defecto de CodeIgniter y añade algunos métodos de ejemplo.
Edita el archivo app/Controllers/Home.php
y reemplaza su contenido por:
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use CodeIgniter\Database\Exceptions\DatabaseException; // Importa la excepción de base de datos
use CodeIgniter\Cache\Exceptions\CacheException; // Importa la excepción de caché
class Home extends Controller
{
/**
* Método por defecto, página de inicio
*/
public function index(): string
{
// Devuelve un mensaje de bienvenida simple
return '<h1>¡Hola ServBay y CodeIgniter!</h1><p>Tu proyecto CodeIgniter está funcionando en ServBay.</p>';
}
/**
* Método de ejemplo para Memcached
*/
public function memcached(): string
{
try {
$cache = \Config\Services::cache();
// Intenta guardar un valor en caché
$success = $cache->save('servbay_memcached_key', '¡Hola Memcached desde CodeIgniter!', 60); // 60 segundos
if (!$success) {
return 'Error: No se pudo guardar datos en Memcached. Revisa el servicio y la configuración de Memcached.';
}
// Intenta recuperar el valor de caché
$value = $cache->get('servbay_memcached_key');
if ($value === null) {
return 'Error: No se pudo obtener datos de Memcached. Puede que la caché haya expirado o el servicio no esté disponible.';
}
return 'Prueba de Memcached exitosa: ' . $value;
} catch (CacheException $e) {
// Captura errores relacionados con caché
return 'Error de caché: ' . $e->getMessage() . '. Asegúrate de que el servicio Memcached esté activo y configurado correctamente.';
} catch (\Exception $e) {
// Captura cualquier otra excepción
return 'Ha ocurrido un error inesperado: ' . $e->getMessage();
}
}
/**
* Método de ejemplo para Redis
*/
public function redis(): string
{
try {
$cache = \Config\Services::cache();
// Intenta guardar un valor en caché
$success = $cache->save('servbay_redis_key', '¡Hola Redis desde CodeIgniter!', 60); // 60 segundos
if (!$success) {
return 'Error: No se pudo guardar datos en Redis. Revisa el servicio y la configuración de Redis.';
}
// Intenta recuperar el valor de caché
$value = $cache->get('servbay_redis_key');
if ($value === null) {
return 'Error: No se pudo obtener datos de Redis. Puede que la caché haya expirado o el servicio no esté disponible.';
}
return 'Prueba de Redis exitosa: ' . $value;
} catch (CacheException $e) {
// Captura errores relacionados con caché
return 'Error de caché: ' . $e->getMessage() . '. Asegúrate de que el servicio Redis esté activo y configurado correctamente.';
} catch (\Exception $e) {
// Captura cualquier otra excepción
return 'Ha ocurrido un error inesperado: ' . $e->getMessage();
}
}
/**
* Insertar un usuario en la base de datos (MySQL/PostgreSQL)
*/
public function addUser(): string
{
try {
$db = \Config\Database::connect();
// Verifica si la tabla 'users' existe
if (!$db->tableExists('users')) {
return 'Error: La tabla "users" no existe. Ejecuta primero las migraciones de la base de datos.';
}
// Inserta nuevos datos
$data = [
'name' => 'Usuario de Demo ServBay',
'email' => 'user_' . time() . '@servbay.demo', // Crea un email único usando time()
];
$db->table('users')->insert($data);
// Verifica que la inserción fue exitosa (opcional)
// if ($db->affectedRows() > 0) {
return 'Usuario agregado exitosamente: ' . $data['email'];
// } else {
// return 'Error: No se pudo agregar el usuario.';
// }
} catch (DatabaseException $e) {
// Captura errores de base de datos
return 'Error en la base de datos: ' . $e->getMessage() . '. Verifica la conexión y la estructura de la tabla.';
} catch (\Exception $e) {
// Captura cualquier otra excepción
return 'Ha ocurrido un error inesperado: ' . $e->getMessage();
}
}
/**
* Listar usuarios almacenados en la base de datos (MySQL/PostgreSQL)
*/
public function listUsers(): string
{
try {
$db = \Config\Database::connect();
// Verifica si la tabla 'users' existe
if (!$db->tableExists('users')) {
return 'Error: La tabla "users" no existe. Ejecuta primero las migraciones de la base de datos.';
}
// Consulta todos los usuarios
$users = $db->table('users')->get()->getResult();
if (empty($users)) {
return 'No se encontraron usuarios en la base de datos.';
}
// Devuelve la lista de usuarios en formato JSON
return json_encode($users);
} catch (DatabaseException $e) {
// Captura errores de base de datos
return 'Error en la base de datos: ' . $e->getMessage() . '. Verifica la conexión y la estructura de la tabla.';
} catch (\Exception $e) {
// Captura cualquier otra excepción
return 'Ha ocurrido un error inesperado: ' . $e->getMessage();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
Este controlador actualizado ofrece mensajes claros y manejo básico de errores para facilitar la identificación de posibles problemas.
Configurar rutas
Para poder acceder a los métodos de ejemplo que agregaste en el controlador Home
vía URL, es necesario añadir las rutas correspondientes en el archivo de rutas de CodeIgniter.
Edita el archivo app/Config/Routes.php
. Localiza la sección donde se definen las rutas usando $routes
y agrega las siguientes líneas:
// ... otras reglas de enrutamiento ...
// Ruta de ejemplo para Memcached
$routes->get('/memcached', 'Home::memcached');
// Ruta de ejemplo para Redis
$routes->get('/redis', 'Home::redis');
// Rutas de ejemplo para la base de datos
$routes->get('/add-user', 'Home::addUser');
$routes->get('/list-users', 'Home::listUsers');
// ... otras reglas de enrutamiento ...
2
3
4
5
6
7
8
9
10
11
12
13
Asegúrate de añadirlas al bloque existente de $routes
sin reemplazar las rutas anteriores.
Acceder al sitio web
Ahora tu proyecto CodeIgniter está configurado y ejecutándose sobre ServBay. Abre tu navegador web y visita el dominio configurado previamente:
Página de inicio:
https://servbay-codeigniter-test.local
Deberías ver una página con el mensaje¡Hola ServBay y CodeIgniter!
, confirmando que tu proyecto responde correctamente mediante el servidor web de ServBay.Ejemplo con Memcached:
https://servbay-codeigniter-test.local/memcached
Si el servicio Memcached está activo y bien configurado, verás una salida similar aPrueba de Memcached exitosa: ¡Hola Memcached desde CodeIgniter!
.Ejemplo con Redis:
https://servbay-codeigniter-test.local/redis
Si Redis está funcionando y bien configurado, obtendrás un mensaje comoPrueba de Redis exitosa: ¡Hola Redis desde CodeIgniter!
.
Ejemplos de operaciones con base de datos (MySQL/PostgreSQL)
Antes de usar los ejemplos de base de datos, necesitas ejecutar las migraciones de CodeIgniter para crear la tabla users
.
Crear la estructura de la base de datos (ejecutar migraciones)
Abre tu terminal y navega al directorio del proyecto:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1Crear archivo de migración: Usa la herramienta de línea de comandos de CodeIgniter para generar el archivo que definirá la tabla
users
:bashphp spark make:migration create_users_table
1Esto creará un archivo PHP dentro de
app/Database/Migrations
.Editar el archivo de migración: Abre el nuevo archivo generado (nombre similar a
YYYY-MM-DD-HHMMSS_CreateUsersTable.php
) y define la estructura de la tabla en el métodoup()
. Nota que existen ligeras diferencias en la sintaxis de timestamps por defecto en MySQL y PostgreSQL (CURRENT_TIMESTAMP
vsNOW()
). La claseRawSql
ayuda a gestionar estas diferencias. Ejemplo:php<?php namespace App\Database\Migrations; use CodeIgniter\Database\Migration; use CodeIgniter\Database\RawSql; // Asegúrate de importar la clase RawSql class CreateUsersTable extends Migration { public function up() { $this->forge->addField([ 'id' => [ 'type' => 'INT', 'constraint' => 5, 'unsigned' => true, 'auto_increment' => true, ], 'name' => [ 'type' => 'VARCHAR', 'constraint' => '100', ], 'email' => [ 'type' => 'VARCHAR', 'constraint' => '100', 'unique' => true, // El campo email será único ], 'created_at' => [ 'type' => 'TIMESTAMP', // Selecciona dinámicamente la expresión correcta para el valor por defecto según la base de datos // MySQL: 'default' => new RawSql('CURRENT_TIMESTAMP'), // PostgreSQL: 'default' => new RawSql('NOW()'), 'default' => new RawSql($this->db->getPlatform() === 'MySQLi' ? 'CURRENT_TIMESTAMP' : 'NOW()'), ], 'updated_at' => [ 'type' => 'TIMESTAMP', // MySQL: 'default' => new RawSql('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'), // PostgreSQL: 'default' => new RawSql('NOW()'), 'default' => new RawSql($this->db->getPlatform() === 'MySQLi' ? 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' : 'NOW()'), ], ]); $this->forge->addKey('id', true); // Establece 'id' como clave primaria $this->forge->createTable('users'); // Crea la tabla 'users' } public function down() { // Para revertir la migración: elimina la tabla 'users' $this->forge->dropTable('users'); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51Nota: El ejemplo gestiona de forma dinámica la sintaxis de timestamps por defecto según el motor de base de datos. En proyectos reales, podrías necesitar una estrategia de migraciones aún más robusta o archivos específicos para cada motor.
Ejecutar la migración: Ejecuta el siguiente comando para crear la tabla:
bashphp spark migrate
1Si todo va bien, la terminal mostrará un mensaje de éxito. Puedes verificar la existencia de la tabla
users
a través de la herramienta de gestión de bases de datos de ServBay (como Adminer).
Probar los ejemplos de base de datos
Verifica que has configurado correctamente la conexión en app/Config/Database.php
y que la tabla users
existe tras ejecutar la migración.
Agregar un usuario a la base de datos: Accede a
https://servbay-codeigniter-test.local/add-user
Cada visita insertará un nuevo usuario en la tabla. Deberías ver un mensaje comoUsuario agregado exitosamente: [email protected]
.Listar usuarios en la base de datos: Accede a
https://servbay-codeigniter-test.local/list-users
Este endpoint listará todas las filas de la tablausers
en formato JSON.
Resumen
Siguiendo los pasos anteriores, has creado, configurado y ejecutado con éxito un proyecto CodeIgniter en el entorno ServBay para macOS. Has aprendido a crear tu proyecto con Composer, configurar correctamente los sitios web de ServBay apuntando al directorio adecuado, establecer conexiones de base de datos y sistemas de caché en CodeIgniter, y verificar con ejemplos prácticos la integración de ambos. ServBay te permite simplificar la implementación y gestión del entorno local, para que puedas concentrarte en el desarrollo de tus aplicaciones con CodeIgniter.