Tworzenie i uruchamianie projektu CodeIgniter
Czym jest CodeIgniter?
CodeIgniter to lekki i wydajny framework do tworzenia aplikacji webowych w PHP. Framework ten opiera się na wzorcu Model-View-Controller (MVC), ułatwiając programistom szybkie budowanie bogatych funkcjonalnie stron internetowych. Dzięki przejrzystej strukturze, świetnej wydajności i łatwości nauki, CodeIgniter jest jednym z najchętniej wybieranych frameworków przez społeczność PHP.
Najważniejsze cechy i zalety CodeIgniter
- Lekki rdzeń: Silnik CodeIgniter jest bardzo kompaktowy, zawiera tylko niezbędne komponenty, co przekłada się na szybkie ładowanie.
- Wyjątkowa wydajność: Framework zaprojektowano z myślą o efektywności i obsłudze wielu jednoczesnych zapytań, zapewniając sprawne działanie aplikacji.
- Szybki start: Klarowna dokumentacja oraz intuicyjne API ułatwiają naukę i pozwalają szybko rozpocząć pracę.
- Wysoka elastyczność: Możliwość dowolnego dołączania bibliotek zewnętrznych oraz łatwe rozszerzanie funkcjonalności według potrzeb projektu.
- Aktywna społeczność: Duża, zaangażowana społeczność, która oferuje szerokie wsparcie i bogactwo materiałów.
CodeIgniter sprawdza się zarówno w małych projektach, jak i w dużych aplikacjach korporacyjnych, usprawniając tworzenie nowoczesnych rozwiązań webowych.
Konfiguracja środowiska CodeIgniter w ServBay
ServBay to narzędzie stworzone do konfiguracji lokalnego środowiska webowego na macOS i Windows, które integruje PHP, bazy danych (MySQL, PostgreSQL, MongoDB), systemy cache (Redis, Memcached), serwery webowe (Caddy, Nginx, Apache) oraz wygodny panel zarządzania. Z ServBay łatwo uruchomisz i obsłużysz środowisko wymagane przez CodeIgniter.
W tym artykule poznasz praktyczny sposób na utworzenie, skonfigurowanie i uruchomienie projektu CodeIgniter z pomocą ServBay oraz nauczysz się, jak integrować różne bazy danych i cache.
Wymagania wstępne
Przed rozpoczęciem upewnij się, że:
- Zainstalowałeś i uruchomiłeś ServBay na systemie macOS lub Windows.
- Aktywowałeś wybraną wersję PHP (np. PHP 8.3) w ServBay.
- Aktywowałeś wybrane składniki baz danych i cache (np. MySQL, PostgreSQL, Redis, Memcached) w ServBay.
Tworzenie projektu CodeIgniter
ServBay zaleca, aby wszystkie projekty stron www umieszczać w standardowych katalogach domyślnych, co ułatwia zarządzanie serwisami lokalnymi:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
Instalacja Composer
ServBay jest dostarczany z Composerem, więc nie trzeba instalować go ręcznie. Możesz użyć polecenia
composer
bezpośrednio w terminalu.Przejście do katalogu głównego stron
Otwórz terminal i przejdź do rekomendowanego katalogu:
macOS:
bashcd /Applications/ServBay/www
1Windows:
cmdcd C:\ServBay\www
1Tworzenie projektu CodeIgniter
Użyj Composer do stworzenia nowej aplikacji CodeIgniter 4 w katalogu
servbay-codeigniter-app
:bashcomposer create-project codeigniter4/appstarter servbay-codeigniter-app
1Composer pobierze szkielet i zależności aplikacji do katalogu
servbay-codeigniter-app
.Wejście do katalogu projektu
Przejdź do nowo utworzonego katalogu CodeIgniter:
macOS:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1Windows:
cmdcd C:\ServBay\www\servbay-codeigniter-app
1
Wstępna konfiguracja
Konfiguracja połączenia z bazą danych
Konfigurację bazy danych CodeIgniter znajdziesz w pliku app/Config/Database.php
. Przed użyciem bazy należy wprowadzić odpowiednie dane dostępowe.
Po pierwsze, jeśli planujesz wykorzystać bazę danych, utwórz ją przez narzędzia ServBay (Adminer lub phpMyAdmin – dostępne z interfejsu ServBay), nadając jej nazwę servbay_codeigniter_app
.
Następnie edytuj plik app/Config/Database.php
, znajdź tablicę $default
i dostosuj dane dostępowe według wybranej bazy (MySQL, PostgreSQL). Domyślne dane logowania dla baz danych ServBay to zazwyczaj root
i password
.
Przykład konfiguracji MySQL:
php
public $default = [
'DSN' => '',
'hostname' => '127.0.0.1', // Baza ServBay zwykle działa na 127.0.0.1
'username' => 'root', // Domyślna nazwa użytkownika ServBay
'password' => 'password', // Domyślne hasło ServBay
'database' => 'servbay_codeigniter_app', // Nazwa utworzonej bazy
'DBDriver' => 'MySQLi', // Wybierz driver zgodnie z bazą: MySQLi lub Pdo dla MySQL
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8mb4',
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306, // Domyślny port 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
Dla PostgreSQL parametr 'DBDriver'
ustaw na 'Postgre'
, port to standardowo 5432
, a część dotycząca znakowania może wymagać korekty.
Konfiguracja cache (Memcached/Redis)
Jeśli planujesz korzystać z Memcached lub Redis jako mechanizmu cache, ustaw to w pliku app/Config/Cache.php
.
Edytuj konfigurację w wybranym fragmencie pliku. Domyślny port Memcached w ServBay to 11211
, Redis – 6379
, zazwyczaj bez hasła.
Przykład dla Memcached:
php
public $memcached = [
'host' => '127.0.0.1', // Memcached ServBay działa zwykle na 127.0.0.1
'port' => 11211, // Domyślny port Memcached
'weight' => 1,
];
1
2
3
4
5
2
3
4
5
Przykład dla Redis:
php
public string $handler = 'redis'; // Ustaw domyślny obsługiwacz cache na Redis
public $default = [ // Konfiguracja Redis
'host' => '127.0.0.1', // Redis ServBay działa na 127.0.0.1
'password' => null, // Zazwyczaj bez hasła
'port' => 6379, // Domyślny port Redis
'timeout' => 0,
'database' => 0,
];
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Pamiętaj o dostosowaniu sekcji na podstawie wybranych pakietów cache.
Konfiguracja serwera WWW (Ustawienia strony w ServBay)
Skorzystaj z funkcji strony ServBay, by ustawić serwer WWW, kierujący na katalog Twojego projektu CodeIgniter.
- Uruchom panel aplikacji ServBay.
- Przejdź do zakładki Strony (Websites).
- Kliknij przycisk
+
w lewym dolnym rogu, aby dodać nową stronę. - Uzupełnij dane:
- Nazwa (Name): np.
My First CodeIgniter Dev Site
. - Domena (Domain): domena, przez którą chcesz uzyskać dostęp lokalnie, np.
servbay-codeigniter-test.local
(ServBay automatycznie obsługuje końcówkę.local
). - Typ strony (Site Type): wybierz
PHP
. - Wersja PHP (PHP Version): wybierz np.
8.3
. - Katalog główny strony (Document Root): to ważne – plik wejściowy CodeIgniter (
index.php
) znajduje się w katalogupublic
w projekcie, zatem ustaw katalog główny napublic
:/Applications/ServBay/www/servbay-codeigniter-app/public
.
- Nazwa (Name): np.
- Kliknij Dodaj (Add), by zapisać konfigurację.
- Po wprowadzeniu zmian rozpocznij aplikowanie ustawień.
Szczegółową instrukcję znajdziesz w Dodawanie pierwszej strony.
Dodawanie przykładowego kodu
Aby sprawdzić, czy aplikacja działa oraz przetestować połączenia z bazą i cache, zaktualizujemy kontroler domyślny Home
, dodając wersje testowe.
Edytuj app/Controllers/Home.php
i zamień zawartość na:
php
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use CodeIgniter\Database\Exceptions\DatabaseException; // Dodaj klasę obsługi błędów bazy
use CodeIgniter\Cache\Exceptions\CacheException; // Dodaj klasę obsługi błędów cache
class Home extends Controller
{
/**
* Metoda domyślna (strona główna)
*/
public function index(): string
{
// Zwraca prostą informację powitalną
return '<h1>Hello ServBay and CodeIgniter!</h1><p>Your CodeIgniter project is running on ServBay.</p>';
}
/**
* Przykład Memcached
*/
public function memcached(): string
{
try {
$cache = \Config\Services::cache();
// Spróbuj zapisać do cache
$success = $cache->save('servbay_memcached_key', 'Hello Memcached from CodeIgniter!', 60); // Cache na 60 sek.
if (!$success) {
return 'Error: Failed to save data to Memcached. Check Memcached service and configuration.';
}
// Spróbuj odczytać z 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) {
// Obsługa wyjątków cache
return 'Cache Error: ' . $e->getMessage() . '. Ensure Memcached service is running and configured correctly.';
} catch (\Exception $e) {
// Inne potencjalne błędy
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
/**
* Przykład Redis
*/
public function redis(): string
{
try {
$cache = \Config\Services::cache();
// Spróbuj zapisać do cache
$success = $cache->save('servbay_redis_key', 'Hello Redis from CodeIgniter!', 60); // Cache na 60 sek.
if (!$success) {
return 'Error: Failed to save data to Redis. Check Redis service and configuration.';
}
// Spróbuj odczytać z 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) {
// Obsługa wyjątków cache
return 'Cache Error: ' . $e->getMessage() . '. Ensure Redis service is running and configured correctly.';
} catch (\Exception $e) {
// Inne potencjalne błędy
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
/**
* Dodawanie użytkownika do bazy danych (MySQL/PostgreSQL)
*/
public function addUser(): string
{
try {
$db = \Config\Database::connect();
// Sprawdź, czy istnieje tabela 'users'
if (!$db->tableExists('users')) {
return 'Error: "users" table does not exist. Please run database migrations first.';
}
// Dodanie wpisu
$data = [
'name' => 'ServBay Demo User',
'email' => 'user_' . time() . '@servbay.demo', // Unikalny email z time()
];
$db->table('users')->insert($data);
// Po udanym dodaniu (insert zwykle zwraca true)
// if ($db->affectedRows() > 0) {
return 'User added successfully: ' . $data['email'];
// } else {
// return 'Error: Failed to add user.';
// }
} catch (DatabaseException $e) {
// Błędy bazy danych
return 'Database Error: ' . $e->getMessage() . '. Check database connection and table structure.';
} catch (\Exception $e) {
// Inne potencjalne błędy
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
/**
* Pobieranie użytkowników z bazy (MySQL/PostgreSQL)
*/
public function listUsers(): string
{
try {
$db = \Config\Database::connect();
// Sprawdź, czy istnieje tabela 'users'
if (!$db->tableExists('users')) {
return 'Error: "users" table does not exist. Please run database migrations first.';
}
// Pobierz wszystkich użytkowników
$users = $db->table('users')->get()->getResult();
if (empty($users)) {
return 'No users found in the database.';
}
// Wydrukuj dane w formacie JSON
return json_encode($users);
} catch (DatabaseException $e) {
// Błędy bazy danych
return 'Database Error: ' . $e->getMessage() . '. Check database connection and table structure.';
} catch (\Exception $e) {
// Inne potencjalne błędy
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
Tak uzupełniony kontroler umożliwia czytelniejsze komunikaty i uproszczone testowanie funkcji integracji.
Konfiguracja routingu
By uzyskać dostęp URL do nowych metod kontrolera Home
, dodaj odpowiednie reguły routingu w pliku app/Config/Routes.php
:
php
// ... istniejące reguły routingu ...
// Routing testowy dla Memcached
$routes->get('/memcached', 'Home::memcached');
// Routing testowy dla Redis
$routes->get('/redis', 'Home::redis');
// Routing testowy dla bazy danych
$routes->get('/add-user', 'Home::addUser');
$routes->get('/list-users', 'Home::listUsers');
// ... istniejące reguły routingu ...
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
Dodaj powyższe reguły do istniejącej definicji $routes
, nie nadpisuj wcześniejszych wpisów.
Dostęp do strony
Projekt CodeIgniter jest już skonfigurowany i działa w środowisku ServBay. Otwórz przeglądarkę i przejdź pod skonfigurowaną domenę:
Strona główna:
https://servbay-codeigniter-test.local
Powinien pojawić się napisHello ServBay and CodeIgniter!
, co oznacza, że strona działa prawidłowo.Test Memcached:
https://servbay-codeigniter-test.local/memcached
Po poprawnej konfiguracji powinieneś ujrzeć:Memcached Test Success: Hello Memcached from CodeIgniter!
.Test Redis:
https://servbay-codeigniter-test.local/redis
Po poprawnej konfiguracji powinieneś ujrzeć:Redis Test Success: Hello Redis from CodeIgniter!
.
Przykład obsługi bazy danych (MySQL/PostgreSQL)
By uruchomić testy bazy danych, musisz najpierw wygenerować strukturę tabeli users
przy pomocy migracji CodeIgniter.
Tworzenie struktury bazy (migracje)
Przejdź do katalogu projektu CodeIgniter:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1Tworzenie pliku migracji: Wygeneruj plik migracji tabeli
users
poprzez CLI CodeIgniter:bashphp spark make:migration create_users_table
1Plik znajdziesz pod
app/Database/Migrations
.Edytuj plik migracji: Otwórz nowo utworzony plik (np.
YYYY-MM-DD-HHMMSS_CreateUsersTable.php
), w metodzieup()
zdefiniuj strukturę z użyciem CodeIgniter i RawSql. Dla MySQL i PostgreSQL domyślna wartość timestampu różni się (CURRENT_TIMESTAMP
vsNOW()
), a RawSql pozwala na dynamiczne przypisanie. Przykład:php<?php namespace App\Database\Migrations; use CodeIgniter\Database\Migration; use CodeIgniter\Database\RawSql; // Upewnij się, że importujesz 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, // Ustaw pole email jako unikalne ], 'created_at' => [ 'type' => 'TIMESTAMP', // Dynamiczne przypisanie domyślnej wartości timestamp // 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); // Ustaw id jako klucz główny $this->forge->createTable('users'); // Utwórz tabelę users } public function down() { // Cofnięcie migracji (usunięcie 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
51Uwaga: Powyższy kod dynamicznie dopasowuje domyślny timestamp zależnie od platformy bazy. W większych projektach można wdrożyć bardziej szczegółowe migracje z dedykowanymi plikami dla różnych baz.
Uruchom migrację: W terminalu wpisz:
bashphp spark migrate
1Jeśli migracja przebiegnie pomyślnie, pojawi się stosowny komunikat. Możesz też zweryfikować w Adminerze, czy tabela
users
istnieje w bazieservbay_codeigniter_app
.
Testowanie bazy danych
Po poprawnej konfiguracji połączenia (app/Config/Database.php
) i migracji tabeli, możesz przetestować:
Dodawanie użytkownika: Wejdź na
https://servbay-codeigniter-test.local/add-user
Każda wizyta utworzy nowy wpis w tabeliusers
. Powinna pojawić się informacja typuUser added successfully: user_XXXXXXXXXX@servbay.demo
.Wyświetlanie wszystkich użytkowników: Wejdź na
https://servbay-codeigniter-test.local/list-users
Wyświetli listę użytkowników w formacie JSON.
Podsumowanie
Wykonując powyższe kroki, utworzyłeś, skonfigurowałeś i uruchomiłeś aplikację CodeIgniter na ServBay w systemie macOS lub Windows. Zobaczyłeś, jak tworzyć projekt poprzez Composer, skonfigurować stronę w ServBay, ustawić połączenia do bazy i cache oraz testować ich działanie przy pomocy przykładowego kodu. ServBay upraszcza konfigurację lokalnego środowiska developerskiego, pozwalając skupić się na właściwym rozwoju aplikacji CodeIgniter.