Membina dan Menjalankan Projek Slim Framework di ServBay
Dokumen ini membimbing anda bagaimana untuk mencipta, mengkonfigurasi, dan menjalankan projek Slim Framework PHP menggunakan persekitaran pembangunan web tempatan yang mantap iaitu ServBay. ServBay membawakan pakej PHP, pelayan web (Caddy/Nginx/Apache) dan pelbagai perisian pangkalan data yang telah digabungkan, menjadikannya pilihan terbaik untuk pembangunan dengan Slim.
Apakah Itu Slim?
Slim ialah rangka kerja mikroskopik PHP yang ringan, direka khas untuk membina aplikasi web dan API yang ringkas tetapi berkuasa secara cepat. Ia menyediakan keupayaan asas routing, pemprosesan permintaan, dan pemprosesan respons. Slim sangat sesuai untuk projek yang memerlukan pembangunan serta pementasan yang pantas, atau digunakan sebagai modul teras kepada aplikasi yang lebih kompleks.
Ciri & Kelebihan Utama Slim
- Ringan: Kod teras Slim sangat kecil, penggunaan sumber rendah, dan pantas untuk dilancarkan; sesuai untuk aplikasi skala kecil hingga sederhana atau perkhidmatan mikro.
- Fleksibel: Slim direka sangat modular dan boleh digabungkan dengan mana-mana komponen atau pustaka pihak ketiga (seperti enjin templat, ORM, pustaka autentikasi dan sebagainya), membolehkan kebebasan memilih teknologi yang paling sesuai untuk keperluan projek anda.
- Mudah Digunakan: API yang ringkas dan dokumentasi yang jelas membolehkan pembangun memahami serta mula bekerja dengan pantas.
- Routing Berkuasa: Menyokong pelbagai kaedah HTTP (GET, POST, PUT, DELETE, dan lain-lain) serta konfigurasi route lanjutan seperti kumpulan route, middleware, dan parameter dinamik.
- Sokongan Middleware: Lapisan middleware Slim membenarkan anda melaksanakan tugas antara permintaan masuk dan logik aplikasi, atau sebelum respons dihantar ke klien; contohnya autentikasi, logging, CORS dan banyak lagi.
Slim merupakan pilihan ideal untuk membina API RESTful, prototaip pantas, serta menjadi asas bagi modul aplikasi berdiri sendiri.
Membina & Menjalankan Projek Slim dengan ServBay
Panduan ini menggunakan persekitaran PHP pratetap ServBay dan fungsi Websites untuk menyediakan pelayan web, serta memastikan akses kepada projek Slim anda hanya dengan konfigurasi minimum.
Prasyarat
Pastikan anda telah menyediakan perkara berikut sebelum memulakan:
- Memasang & Menjalankan ServBay: Pastikan ServBay telah dipasang di sistem macOS anda dan aplikasi ServBay sedang berjalan.
- Composer Disertakan Dalam ServBay: Composer telah siap digabung dalam ServBay; anda tidak perlu memasangnya secara manual.
Mencipta Projek Slim
ServBay menyarankan semua projek laman web diletakkan dalam direktori /Applications/ServBay/www
untuk memudahkan pengurusan dan konfigurasi.
- Navigasi ke direktori root laman web ServBay:bash
cd /Applications/ServBay/www
1 - Cipta direktori projek: Buat satu folder baharu untuk projek Slim anda.bash
mkdir servbay-slim-app
1 - Masuk ke folder projek:bash
cd servbay-slim-app
1 - Pasang Slim dengan Composer: Gunakan Composer dalam direktori projek untuk memasang Slim Framework dan pelaksanaan PSR-7.bashPerintah ini akan memuat turun pustaka Slim dan
composer require slim/slim "^4.0" slim/psr7 -W
1slim/psr7
ke dalam foldervendor
projek, serta menghasilkan failcomposer.json
dancomposer.lock
.
Memulakan Aplikasi Slim
- Cipta fail utama (entry-point): Projek Slim biasanya mempunyai satu fail utama (cth.
public/index.php
) untuk mengurus semua permintaan. Cipta direktoripublic
dan failindex.php
di dalamnya.bashmkdir public touch public/index.php
1
2 - Edit fail utama: Buka
public/index.php
dan tambah kod asas aplikasi Slim berikut:phpKod ini mewujudkan aplikasi Slim paling asas, mendefinisikan route GET pada URL root (<?php // Memuatkan fail autoloader Composer require __DIR__ . '/../vendor/autoload.php'; // Import antara muka PSR-7 dan kelas kilang Slim yang diperlukan use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; // Membina instans aplikasi Slim $app = AppFactory::create(); // Tambah route mudah: Layan permintaan GET ke root '/' $app->get('/', function (Request $request, Response $response, $args) { // Menulis kandungan ke dalam respons $response->getBody()->write("Hello ServBay!"); // Menghantar semula objek respons return $response; }); // Jalankan aplikasi Slim $app->run();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22/
) dan memaparkan teks "Hello ServBay!".
Konfigurasi Laman Web ServBay
Untuk mengakses projek Slim anda dalam pelayar, anda perlu mengkonfigurasi satu Website (disebut "Host" dalam versi lama) pada ServBay.
- Buka aplikasi ServBay.
- Pergi ke modul Websites.
- Klik untuk menambah laman web baharu.
- Lengkapkan maklumat mengikut projek anda:
- Name:
My First Slim Dev Site
(atau mana-mana nama pilihan anda) - Domain:
servbay-slim-test.local
(disarankan menggunakan.local
atau.test
untuk pembangunan tempatan) - Website Type:
PHP
- PHP Version: Pilih versi PHP yang diperlukan, sebagai contoh
8.3
. - Document Root: Klik "Browse" dan pilih folder
public
projek anda, iaitu/Applications/ServBay/www/servbay-slim-app/public
. Ini kerana fail utamaindex.php
Slim berada dalam folder ini dan pelayan web perlu menunjuk ke direktori tersebut.
- Name:
- Simpan konfigurasi laman web. ServBay akan mengemaskini konfigurasi pelayan web dan mengaktifkannya secara automatik.
Untuk langkah terperinci, rujuk Tambah Laman Web Pertama.
Akses Laman Web Slim Anda
Setelah siap dikonfigurasi, buka pelayar web dan lawati domain anda yang ditetapkan, seperti https://servbay-slim-test.local
.
Jika semuanya telah diatur dengan betul, anda akan melihat teks Hello ServBay!
pada halaman pelayar. Ini menandakan projek Slim anda berjaya dijalankan melalui pelayan web ServBay.
Contoh Integrasi Pangkalan Data
Slim sendiri tidak menyediakan lapisan pengabstrakan pangkalan data tetapi sangat mudah untuk digabungkan dengan pustaka pengkalan data PHP lain. Dalam contoh ini, kita menggunakan Eloquent ORM (melalui komponen illuminate/database
dari Laravel) sebagai contoh untuk sambungan MySQL dan PostgreSQL, berserta contoh integrasi Memcached dan Redis.
Prasyarat: Membina Pangkalan Data & Menjalankan Migrasi
Sebelum mengintegrasikan pangkalan data, anda perlu mencipta pangkalan data di ServBay dan menyediakan struktur jadual aplikasi.
Cipta pangkalan data:
- Buka aplikasi ServBay dan pergi ke pakej pangkalan data yang anda gunakan (contoh MySQL atau PostgreSQL).
- Gunakan alat pengurusan ServBay (phpMyAdmin untuk MySQL/MariaDB, pgAdmin untuk PostgreSQL) atau klien baris arahan untuk mencipta satu pangkalan data baharu, contohnya dinamakan
servbay_slim_app
. - Kata laluan root pangkalan data kebiasaannya ialah
password
secara lalai; anda boleh menyemaknya atau menukarnya pada antaramuka ServBay.
Pasang dan konfigurasikan Phinx (alat migrasi): Phinx membolehkan anda mengurus evolusi struktur pangkalan data secara mudah.
- Dalam root projek (
/Applications/ServBay/www/servbay-slim-app
), pasangkan Phinx:bashcomposer require robmorgan/phinx
1 - Inisialisasi konfigurasi Phinx:bashIni menghasilkan fail
vendor/bin/phinx init
1phinx.yml
pada direktori projek. Edit fail ini dan konfigurasi sambungan pangkalan data anda, contohnya:yamlpaths: migrations: '%%PHINX_CONFIG_DIR%%/db/migrations' seeds: '%%PHINX_CONFIG_DIR%%/db/seeds' environments: default_migration_table: phinxlog default_environment: development # atau nama environment anda development: # Ubah suai mengikut jenis pangkalan data adapter: mysql # atau pgsql host: 127.0.0.1 name: servbay_slim_app # Nama pangkalan data user: root pass: password # Kata laluan anda port: 3306 # lalai MySQL, PostgreSQL biasanya 5432 charset: utf8mb4 # Disyorkan untuk MySQL collation: utf8mb4_unicode_ci # Disyorkan untuk MySQL version_order: creation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- Dalam root projek (
Cipta fail migrasi: Gunakan perintah Phinx untuk mencipta fail migrasi baharu.
bashvendor/bin/phinx create CreateUsersTable
1Ini akan menghasilkan fail PHP dalam
db/migrations
. Buka fail itu dan edit kaedahchange()
untuk mendefinisikan struktur jadualusers
:php<?php declare(strict_types=1); use Phinx\Migration\AbstractMigration; final class CreateUsersTable extends AbstractMigration { /** * Change Method. * * Write your reversible migrations using this method. * * More information on writing migrations is available here: * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method * * Remember to call "create()" or "update()" and NOT "save()" when working * with the Table class. */ public function change(): void { $table = $this->table('users'); $table->addColumn('name', 'string') ->addColumn('email', 'string', ['unique' => true]) ->addTimestamps() // Tambah ruangan created_at dan updated_at ->create(); } }
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
28Menjalankan migrasi: Jalankan perintah Phinx dari root projek untuk membina jadual
users
:bashvendor/bin/phinx migrate
1Penting: Pastikan langkah migrasi selesai sebelum menjalankan kod contoh integrasi pangkalan data di bawah.
Penggunaan Komponen illuminate/database
Kita akan mengaplikasikan komponen database Laravel (illuminate/database
) sebagai ORM/builder SQL.
Pasang illuminate/database: Dari root projek
/Applications/ServBay/www/servbay-slim-app
:bashcomposer require illuminate/database
1Inisialisasi sambungan pangkalan data di
public/index.php
: Selepas barisrequire __DIR__ . '/../vendor/autoload.php';
dan sebelum$app = AppFactory::create();
, masukkan kod berikut untuk mengkonfigurasi sambungan:php// ... require & use lain ... use Illuminate\Database\Capsule\Manager as Capsule; // Import Capsule // Inisialisasi Eloquent ORM $capsule = new Capsule; // Tambah konfigurasi sambungan database (ubah driver/nilai mengikut DB anda) $capsule->addConnection([ 'driver' => 'mysql', // atau 'pgsql' 'host' => '127.0.0.1', 'database' => 'servbay_slim_app', // Nama pangkalan data 'username' => 'root', // Nama pengguna anda 'password' => 'password', // Kata laluan anda 'charset' => 'utf8mb4', // Disyorkan untuk MySQL 'collation' => 'utf8mb4_unicode_ci', // Disyorkan untuk MySQL 'prefix' => '', // Untuk PostgreSQL, tambah 'schema' // 'schema' => 'public', ]); // Jadikan global $capsule->setAsGlobal(); // Mulakan Eloquent $capsule->bootEloquent(); // ... cipta instans Slim ($app = AppFactory::create();) ...
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
Contoh MySQL
Anggap anda telah menghidupkan pakej MySQL di ServBay, telah mencipta pangkalan data servbay_slim_app
dan selesai migrasi users
.
Sebelum $app->run();
dalam public/index.php
, tambah route berikut:
php
// ... Kod inisialisasi dan route '/' ...
use Illuminate\Database\Capsule\Manager as Capsule; // Pastikan sudah diimport
// Route untuk menambah pengguna
$app->get('/mysql-add-user', function (Request $request, Response $response, $args) {
try {
Capsule::table('users')->insert([
'name' => 'ServBay Demo User',
'email' => 'servbay-demo-' . time() . '@servbay.test', // Jamin keunikan email
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
$response->getBody()->write('User added to MySQL');
} catch (\Exception $e) {
$response->getBody()->write('Error adding user: ' . $e->getMessage());
$response = $response->withStatus(500); // Kembalikan kod ralat
}
return $response;
});
// Route untuk mendapatkan senarai pengguna
$app->get('/mysql-get-users', function (Request $request, Response $response, $args) {
try {
$users = Capsule::table('users')->get();
$response->getBody()->write($users->toJson()); // Output hasil dalam JSON
$response = $response->withHeader('Content-Type', 'application/json'); // Tetapkan Content-Type
} catch (\Exception $e) {
$response->getBody()->write('Error fetching users: ' . $e->getMessage());
$response = $response->withStatus(500);
}
return $response;
});
// ... $app->run();
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
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
Akses:
- Layari
https://servbay-slim-test.local/mysql-add-user
untuk menambah pengguna baru ke jadualusers
. - Layari
https://servbay-slim-test.local/mysql-get-users
untuk mendapatkan semua pengguna dan keluarkan sebagai JSON.
Contoh PostgreSQL
Jika anda telah menghidupkan pakej PostgreSQL, membina pangkalan data servbay_slim_app
dan selesai migrasi (pastikan konfigurasi adapter
dan port
pada Phinx diatur ke pgsql
dan 5432
).
Dalam public/index.php
, ubahkan konfigurasi driver kepada pgsql
serta tambah parameter schema
:
php
$capsule->addConnection([
'driver' => 'pgsql', // Tukar ke pgsql
'host' => '127.0.0.1',
'database' => 'servbay_slim_app',
'username' => 'root',
'password' => 'password',
'charset' => 'utf8', // Biasanya utk PostgreSQL
'prefix' => '',
'schema' => 'public', // Perlu tentukan schema untuk PostgreSQL
]);
// ... Eloquent setup lain kekal ...
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Tambah route di bawah sebelum $app->run();
:
php
// ... Kod inisialisasi dan route '/' ...
// ... Route MySQL jika ada ...
use Illuminate\Database\Capsule\Manager as Capsule; // Pastikan sudah diimport
// Route untuk menambah pengguna ke PostgreSQL
$app->get('/pgsql-add-user', function (Request $request, Response $response, $args) {
try {
Capsule::table('users')->insert([
'name' => 'ServBay PG Demo User',
'email' => 'servbay-pg-demo-' . time() . '@servbay.test', // Unikkan email
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
$response->getBody()->write('User added to PostgreSQL');
} catch (\Exception $e) {
$response->getBody()->write('Error adding user: ' . $e->getMessage());
$response = $response->withStatus(500);
}
return $response;
});
// Route untuk mendapatkan pengguna dari PostgreSQL
$app->get('/pgsql-get-users', function (Request $request, Response $response, $args) {
try {
$users = Capsule::table('users')->get();
$response->getBody()->write($users->toJson());
$response = $response->withHeader('Content-Type', 'application/json');
} catch (\Exception $e) {
$response->getBody()->write('Error fetching users: ' . $e->getMessage());
$response = $response->withStatus(500);
}
return $response;
});
// ... $app->run();
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
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
Akses:
- Layari
https://servbay-slim-test.local/pgsql-add-user
untuk menambah pengguna ke jadualusers
PostgreSQL. - Layari
https://servbay-slim-test.local/pgsql-get-users
untuk mendapatkan semua pengguna dari PostgreSQL dalam JSON.
Contoh Memcached
ServBay menyediakan pakej Memcached dan sambungan PHP ext-memcached
. Anda hanya perlukan klien PHP; di sini kita gunakan memcached/memcached
.
Pasang klien Memcached: Dari root projek
/Applications/ServBay/www/servbay-slim-app
:bashcomposer require memcached/memcached
1Tambah route Memcached dalam
public/index.php
: Sebelum$app->run();
:php// ... Kod inisialisasi & route database ... // Route menggunakan Memcached $app->get('/memcached-example', function (Request $request, Response $response, $args) { // Buat objek klien Memcached $memcached = new Memcached(); // Sambung ke pelayan Memcached (lalai: 127.0.0.1:11211) $memcached->addServer('127.0.0.1', 11211); $cacheKey = 'my_servbay_cache_key'; // Cuba dapatkan data dari cache $cachedData = $memcached->get($cacheKey); if ($cachedData === false) { // Jika tiada dalam cache, jana data dan cache selama 60s $cachedData = 'Hello Memcached from ServBay! This was not cached.'; $memcached->set($cacheKey, $cachedData, 60); $response->getBody()->write($cachedData); } else { // Jika sudah cache, paparkan dari cache $response->getBody()->write('Hello Memcached from ServBay! This was served from cache.'); } return $response; }); // ... $app->run();
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
Akses: Layari https://servbay-slim-test.local/memcached-example
. Lawatan pertama akan memaparkan "This was not cached."; selepas itu (sebelum tamat tempoh cache) anda akan nampak "This was served from cache."
Contoh Redis
ServBay menyediakan pakej Redis dan sambungan PHP ext-redis
. Anda hanya perlukan klien PHP, dalam contoh ini gunakan predis/predis
.
Pasang klien Redis: Dari root projek
/Applications/ServBay/www/servbay-slim-app
:bashcomposer require predis/predis
1Tambah route Redis dalam
public/index.php
: Sebelum$app->run();
:php// ... Kod inisialisasi & route database ... // ... route Memcached jika ada ... use Predis\Client as RedisClient; // Import klien Predis // Route menggunakan Redis $app->get('/redis-example', function (Request $request, Response $response, $args) { try { // Bina klien Redis (lalai: 127.0.0.1:6379) $redis = new RedisClient([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379, ]); $cacheKey = 'my_servbay_redis_cache_key'; // Cuba dapatkan dari cache $cachedData = $redis->get($cacheKey); if ($cachedData === null) { // Jika tiada, jana data dan cache selama 60s $cachedData = 'Hello Redis from ServBay! This was not cached.'; $redis->setex($cacheKey, 60, $cachedData); // SETEX key seconds value $response->getBody()->write($cachedData); } else { // Jika telah cache, paparkan dari cache $response->getBody()->write('Hello Redis from ServBay! This was served from cache.'); } } catch (\Exception $e) { // Tangkap sebarang ralat operasi $response->getBody()->write('Error connecting to Redis or performing operation: ' . $e->getMessage()); $response = $response->withStatus(500); } return $response; }); // ... $app->run();
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
Akses: Layari https://servbay-slim-test.local/redis-example
. Lawatan pertama menunjukkan "This was not cached.", lawatan seterusnya (sebelum data luput) akan memaparkan "This was served from cache."
Kesimpulan
Mengikuti langkah-langkah di atas, anda telah berjaya membina projek Slim Framework dalam persekitaran pembangunan tempatan ServBay, serta mengkonfigurasi fungsi Website untuk menghoskan dan mengakses projek anda. Anda juga telah mempelajari cara mengintegrasikan pelbagai pakej ServBay (seperti MySQL, PostgreSQL, Memcached, Redis) dan ekstensi PHP berkaitan ke dalam aplikasi Slim anda. Dengan ServBay, pengurusan persekitaran pembangunan tempatan menjadi lebih mudah—membolehkan anda menumpukan perhatian kepada pembangunan aplikasi Slim tanpa kerumitan teknikal.