Creare e avviare un progetto CodeIgniter 
Cos’è CodeIgniter? 
CodeIgniter è un framework leggero e ad alte prestazioni per lo sviluppo di applicazioni web in PHP. Basato sul modello Model-View-Controller (MVC), è pensato per aiutare gli sviluppatori a costruire rapidamente applicazioni web ricche di funzionalità. Grazie alla sua struttura semplice, all'eccellente performance e alla facilità di apprendimento, CodeIgniter è la scelta preferita da molti sviluppatori PHP.
Caratteristiche principali e vantaggi di CodeIgniter 
- Core leggero: Il sistema principale di CodeIgniter è estremamente snello, include solo i componenti essenziali richiesti per il funzionamento e garantisce una velocità di caricamento molto elevata.
- Prestazioni eccellenti: È progettato per l’efficienza, gestisce richieste ad alta concorrenza offrendo grandi performance.
- Facilità d’uso: Dispone di una documentazione chiara e di API intuitive che riducono la curva di apprendimento, consentendo agli sviluppatori di padroneggiarlo rapidamente.
- Elevata flessibilità: Permette di integrare facilmente librerie di terze parti e di espandere o personalizzare le funzioni secondo le esigenze del progetto.
- Supporto da una community attiva: Vanta una vasta e vivace comunità di sviluppatori che offre risorse e supporto.
CodeIgniter è adatto sia per piccoli progetti, sia per applicazioni aziendali di grandi dimensioni, aiutando gli sviluppatori a costruire soluzioni web di alta qualità in modo efficiente.
Configurare un ambiente di sviluppo CodeIgniter con ServBay 
ServBay è uno strumento pensato per facilitare lo sviluppo web locale su macOS e Windows. Include PHP, database (MySQL, PostgreSQL, MongoDB), cache (Redis, Memcached), web server (Caddy, Nginx, Apache) e offre una pratica interfaccia di gestione. Con ServBay puoi facilmente installare e gestire l’ambiente di sviluppo necessario per CodeIgniter.
Questa guida ti accompagnerà attraverso l’utilizzo di ServBay per creare, configurare e avviare un progetto CodeIgniter, mostrando come integrare vari database e servizi di caching.
Prerequisiti 
Prima di iniziare, assicurati di aver completato i seguenti passaggi:
- ServBay è correttamente installato e in esecuzione su macOS o Windows.
- La versione di PHP che intendi utilizzare è abilitata in ServBay (ad es. PHP 8.3).
- In ServBay sono abilitati i package di database e caching necessari (ad es. MySQL, PostgreSQL, Redis, Memcached).
Creazione di un progetto CodeIgniter 
ServBay raccomanda di conservare tutti i tuoi progetti web nelle seguenti directory, così da gestirli più facilmente:
- macOS: /Applications/ServBay/www
- Windows: C:\ServBay\www
- Installa Composer - ServBay include già Composer preinstallato, quindi di norma non è necessaria l’installazione manuale. Puoi utilizzare direttamente il comando - composerda terminale.
- Accedi alla directory root del sito - Apri il terminale e vai nella root consigliata da ServBay: - macOS: bash- cd /Applications/ServBay/www1- Windows: cmd- cd C:\ServBay\www1
- Crea il progetto CodeIgniter - Usa Composer per creare un nuovo progetto CodeIgniter 4. Nel nostro esempio la cartella del progetto sarà chiamata - servbay-codeigniter-app:bash- composer create-project codeigniter4/appstarter servbay-codeigniter-app1- Composer scaricherà lo scheletro dell’applicazione CodeIgniter e tutte le sue dipendenze nella directory - servbay-codeigniter-app.
- Accedi alla directory del progetto - Entra nella cartella del nuovo progetto CodeIgniter: - macOS: bash- cd /Applications/ServBay/www/servbay-codeigniter-app1- Windows: cmd- cd C:\ServBay\www\servbay-codeigniter-app1
Configurazione iniziale 
Configurare la connessione al database 
La configurazione del database di CodeIgniter si trova nel file app/Config/Database.php. Prima di procedere con l’uso del database, devi impostare i parametri di accesso in questo file.
Per prima cosa, se vuoi usare un database, crealo tramite lo strumento di gestione database di ServBay (ad esempio Adminer o phpMyAdmin, disponibili dalla dashboard di ServBay) con il nome servbay_codeigniter_app.
Poi, modifica il file app/Config/Database.php, cerca l’array $default e imposta le credenziali in base al tipo di database che hai abilitato (ad esempio MySQL o PostgreSQL). I valori di default di ServBay per username e password sono spesso root e password.
Ecco un esempio di configurazione per MySQL:
php
public $default = [
    'DSN'      => '',
    'hostname' => '127.0.0.1', // Il database ServBay di solito ascolta su 127.0.0.1
    'username' => 'root',      // Username predefinito di ServBay
    'password' => 'password',  // Password predefinita di ServBay
    'database' => 'servbay_codeigniter_app', // Nome del database
    'DBDriver' => 'MySQLi',    // Imposta il driver secondo il tipo di database
    'DBPrefix' => '',
    'pConnect' => false,
    'DBDebug'  => (ENVIRONMENT !== 'production'),
    'charset'  => 'utf8mb4',
    'DBCollat' => 'utf8mb4_general_ci',
    'swapPre'  => '',
    'encrypt'  => false,
    'compress' => false,
    'strictOn' => false,
    'failover' => [],
    'port'     => 3306,        // Porta predefinita MySQL
];1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Se usi PostgreSQL, imposta DBDriver su 'Postgre', la port di default è 5432 e potresti aver bisogno di modificare le impostazioni relative al charset.
Configurare la connessione alla cache (Memcached/Redis) 
Se vuoi usare Memcached o Redis per la cache, configura il file app/Config/Cache.php.
Apri app/Config/Cache.php, individua la sezione relativa al servizio di caching. In ServBay, Memcached di default risponde sulla porta 11211 e Redis sulla porta 6379, spesso senza password.
Esempio di configurazione per Memcached:
php
public $memcached = [
    'host'   => '127.0.0.1', // Memcached di ServBay ascolta di solito su 127.0.0.1
    'port'   => 11211,       // Porta predefinita Memcached
    'weight' => 1,
];1
2
3
4
5
2
3
4
5
Esempio di configurazione per Redis:
php
public string $handler = 'redis'; // Imposta redis come gestore della cache
public $default = [ // Configurazione Redis
    'host'     => '127.0.0.1', // Redis di ServBay ascolta su 127.0.0.1
    'password' => null,        // Redis tipicamente senza password
    'port'     => 6379,        // Porta predefinita Redis
    'timeout'  => 0,
    'database' => 0,
];1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Assicurati di configurare la sezione corrispondente al servizio di cache che hai abilitato.
Configurare il web server (impostazioni sito ServBay) 
Usa la funzione Siti web di ServBay per configurare il web server e puntare al tuo progetto CodeIgniter.
- Apri l’interfaccia dell’applicazione ServBay.
- Vai nella sezione Siti web (Websites).
- Clicca sul pulsante +in basso a sinistra per aggiungere un nuovo sito.
- Imposta le informazioni del sito: - Nome: Inserisci un nome facile da identificare, ad esempio My First CodeIgniter Dev Site.
- Dominio: Scegli un dominio da usare localmente, ad esempio servbay-codeigniter-test.local. ServBay gestisce automaticamente i domini.local.
- Tipo sito: Seleziona PHP.
- Versione PHP: Scegli la versione che preferisci, ad esempio 8.3.
- Root documento (Document Root): Passo cruciale! Il file di ingresso di CodeIgniter (index.php) si trova nella cartellapublicdel progetto. Imposta quindi la root del sito sulla cartellapublicdel tuo progetto:/Applications/ServBay/www/servbay-codeigniter-app/public.
 
- Nome: Inserisci un nome facile da identificare, ad esempio 
- Clicca su Aggiungi (Add) per salvare la configurazione.
- ServBay potrebbe chiederti di applicare le modifiche: conferma.
Per ulteriori dettagli consulta la guida Aggiungere il primo sito web.
Aggiungere codice di esempio 
Per verificare il funzionamento del progetto e testare la connessione a database e cache, modifichiamo il controller Home di default di CodeIgniter, aggiungendo alcuni metodi di esempio.
Modifica app/Controllers/Home.php e sostituisci il suo contenuto con il codice seguente:
php
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use CodeIgniter\Database\Exceptions\DatabaseException; // Importa le eccezioni database
use CodeIgniter\Cache\Exceptions\CacheException; // Importa le eccezioni cache
class Home extends Controller
{
    /**
     * Metodo predefinito della homepage
     */
    public function index(): string
    {
        // Restituisce un messaggio di benvenuto
        return '<h1>Hello ServBay and CodeIgniter!</h1><p>Your CodeIgniter project is running on ServBay.</p>';
    }
    /**
     * Esempio Memcached
     */
    public function memcached(): string
    {
        try {
            $cache = \Config\Services::cache();
            // Prova a scrivere sulla cache
            $success = $cache->save('servbay_memcached_key', 'Hello Memcached from CodeIgniter!', 60); // 60 secondi di cache
            if (!$success) {
                 return 'Error: Failed to save data to Memcached. Check Memcached service and configuration.';
            }
            // Prova a leggere dalla cache
            $value = $cache->get('servbay_memcached_key');
            if ($value === null) {
                return 'Error: Failed to get data from Memcached. Cache might have expired or service is down.';
            }
            return 'Memcached Test Success: ' . $value;
        } catch (CacheException $e) {
            // Gestisce le eccezioni legate alla cache
            return 'Cache Error: ' . $e->getMessage() . '. Ensure Memcached service is running and configured correctly.';
        } catch (\Exception $e) {
            // Gestisce altre possibili eccezioni
            return 'An unexpected error occurred: ' . $e->getMessage();
        }
    }
    /**
     * Esempio Redis
     */
    public function redis(): string
    {
        try {
            $cache = \Config\Services::cache();
            // Prova a scrivere sulla cache
            $success = $cache->save('servbay_redis_key', 'Hello Redis from CodeIgniter!', 60); // 60 secondi di cache
             if (!$success) {
                 return 'Error: Failed to save data to Redis. Check Redis service and configuration.';
            }
            // Prova a leggere dalla cache
            $value = $cache->get('servbay_redis_key');
             if ($value === null) {
                return 'Error: Failed to get data from Redis. Cache might have expired or service is down.';
            }
            return 'Redis Test Success: ' . $value;
        } catch (CacheException $e) {
             // Gestisce le eccezioni legate alla cache
            return 'Cache Error: ' . $e->getMessage() . '. Ensure Redis service is running and configured correctly.';
        } catch (\Exception $e) {
            // Gestisce altre possibili eccezioni
            return 'An unexpected error occurred: ' . $e->getMessage();
        }
    }
    /**
     * Scrive i dati utente nel database (MySQL/PostgreSQL)
     */
    public function addUser(): string
    {
        try {
            $db = \Config\Database::connect();
            // Verifica che la tabella 'users' esista
            if (!$db->tableExists('users')) {
                 return 'Error: "users" table does not exist. Please run database migrations first.';
            }
            // Inserisce i dati
            $data = [
                'name' => 'ServBay Demo User',
                'email' => 'user_' . time() . '@servbay.demo', // Crea una email univoca usando time()
            ];
            $db->table('users')->insert($data);
            // Controlla l'inserimento (opzionale, insert() normalmente restituisce true)
            // if ($db->affectedRows() > 0) {
                 return 'User added successfully: ' . $data['email'];
            // } else {
            //      return 'Error: Failed to add user.';
            // }
        } catch (DatabaseException $e) {
            // Gestisce le eccezioni database
            return 'Database Error: ' . $e->getMessage() . '. Check database connection and table structure.';
        } catch (\Exception $e) {
             // Gestisce altre possibili eccezioni
            return 'An unexpected error occurred: ' . $e->getMessage();
        }
    }
    /**
     * Legge i dati utente dal database (MySQL/PostgreSQL)
     */
    public function listUsers(): string
    {
         try {
            $db = \Config\Database::connect();
             // Verifica che la tabella 'users' esista
            if (!$db->tableExists('users')) {
                 return 'Error: "users" table does not exist. Please run database migrations first.';
            }
            // Ottiene tutti gli utenti
            $users = $db->table('users')->get()->getResult();
            if (empty($users)) {
                return 'No users found in the database.';
            }
            // Restituisce l’elenco degli utenti in formato JSON
            return json_encode($users);
        } catch (DatabaseException $e) {
             // Gestisce le eccezioni database
            return 'Database Error: ' . $e->getMessage() . '. Check database connection and table structure.';
        } catch (\Exception $e) {
            // Gestisce altre possibili eccezioni
            return 'An unexpected error occurred: ' . $e->getMessage();
        }
    }
}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
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
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
Il controller aggiornato fornisce output chiari ed una gestione basilare degli errori per facilitare la diagnosi dei problemi.
Configurare le rotte 
Per accedere tramite URL ai metodi di esempio aggiunti nel controller Home, configura le rotte nel file app/Config/Routes.php.
Modifica app/Config/Routes.php. Trova la sezione di definizione delle $routes e aggiungi:
php
// ... Altre regole di routing ...
// Rotta di esempio Memcached
$routes->get('/memcached', 'Home::memcached');
// Rotta di esempio Redis
$routes->get('/redis', 'Home::redis');
// Rotte di esempio database
$routes->get('/add-user', 'Home::addUser');
$routes->get('/list-users', 'Home::listUsers');
// ... Altre regole di routing ...1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
Assicurati di aggiungere queste rotte senza sovrascrivere la configurazione esistente.
Accedere al sito web 
Il tuo progetto CodeIgniter è ora pronto e funzionante su ServBay. Apri il browser e accedi tramite il dominio configurato:
- Homepage: - https://servbay-codeigniter-test.localDovresti vedere il messaggio- Hello ServBay and CodeIgniter!, segno che il sito è operativo tramite il web server di ServBay.
- Test Memcached: - https://servbay-codeigniter-test.local/memcachedSe Memcached è configurato correttamente, vedrai un output simile a- Memcached Test Success: Hello Memcached from CodeIgniter!.
- Test Redis: - https://servbay-codeigniter-test.local/redisSe Redis è configurato correttamente, comparirà un messaggio tipo- Redis Test Success: Hello Redis from CodeIgniter!.
Esempi di operazioni database (MySQL/PostgreSQL) 
Per testare le funzioni di database, occorre prima creare la tabella users tramite le migrazioni di CodeIgniter.
Creazione della struttura database (migrazione) 
- Apri il terminale e accedi alla directory del progetto CodeIgniter: bash- cd /Applications/ServBay/www/servbay-codeigniter-app1
- Crea il file di migrazione: usa l’utility CLI di CodeIgniter per generare una migrazione dedicata alla tabella - users:bash- php spark make:migration create_users_table1- Questo comando creerà un nuovo file PHP nella directory - app/Database/Migrations.
- Modifica il file di migrazione: apri il file generato (il nome sarà simile a - YYYY-MM-DD-HHMMSS_CreateUsersTable.php), e aggiorna il metodo- up()per definire struttura e indici della tabella. Nota che la sintassi dei campi timestamp differisce tra MySQL e PostgreSQL (- CURRENT_TIMESTAMPvs- NOW()). CodeIgniter permette di gestirli tramite- RawSql. Ecco un esempio:php- <?php namespace App\Database\Migrations; use CodeIgniter\Database\Migration; use CodeIgniter\Database\RawSql; // Assicurati di importare 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, // Email unica ], 'created_at' => [ 'type' => 'TIMESTAMP', // Imposta il valore di default dinamicamente a seconda del database // 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); // Imposta id come chiave primaria $this->forge->createTable('users'); // Crea la tabella users } public function down() { // Per ripristinare la migrazione, elimina la tabella 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
 51- Nota: L’esempio usa un semplice controllo per determinare la sintassi dei timestamp in base al database. In progetti reali potresti voler gestire migrazioni separate per ogni piattaforma. 
- Esegui la migrazione: Da terminale esegui: bash- php spark migrate1- Se il comando va a buon fine, vedrai un messaggio di successo. Puoi verificare la creazione della tabella - usersnel database- servbay_codeigniter_appusando Adminer o altri strumenti di ServBay.
Esempi pratici d’uso database 
Verifica di aver configurato correttamente la connessione in app/Config/Database.php e di aver eseguito la migrazione per creare la tabella users.
- Aggiungi un utente: Visita - https://servbay-codeigniter-test.local/add-userOgni volta che accedi a questo URL, viene inserito un nuovo utente nella tabella- users. Riceverai un messaggio tipo- User added successfully: user_XXXXXXXXXX@servbay.demo.
- Elenca tutti gli utenti: Visita - https://servbay-codeigniter-test.local/list-usersQuesto percorso recupera tutti i record dalla tabella- userse li visualizza come array JSON.
Conclusione 
Seguendo questi passaggi, hai creato, configurato e avviato correttamente un progetto CodeIgniter nell’ambiente ServBay su macOS o Windows. Hai imparato come creare il progetto con Composer, come impostare il sito tramite la funzione Siti web di ServBay, come configurare le connessioni a database e servizi di cache e come testare l’integrazione tramite codice di esempio. ServBay semplifica il setup e la gestione dell’ambiente locale, permettendoti di concentrarti sullo sviluppo dell’applicazione CodeIgniter.
