Tạo và chạy dự án Slim trên ServBay
Bài viết này sẽ hướng dẫn bạn cách tạo, cấu hình và vận hành một dự án Slim Framework PHP nhanh chóng sử dụng môi trường phát triển web cục bộ mạnh mẽ ServBay. ServBay tích hợp sẵn các phiên bản PHP, máy chủ web (Caddy/Nginx/Apache) và nhiều gói phần mềm cơ sở dữ liệu, là nền tảng lý tưởng để phát triển với Slim.
Slim là gì?
Slim là một PHP micro-framework nhẹ, được thiết kế để xây dựng những ứng dụng web đơn giản nhưng mạnh mẽ và các API một cách nhanh chóng. Framework này cung cấp những tính năng cơ bản như routing, xử lý request và response, cực kỳ phù hợp cho các dự án cần triển khai và phát triển nhanh, hoặc dùng làm nền tảng cho các hệ thống phức tạp hơn.
Những đặc điểm nổi bật của Slim
- Nhẹ: Slim có bộ mã nguồn nhỏ gọn, tiêu thụ ít tài nguyên và khởi động rất nhanh, phù hợp cho ứng dụng vừa và nhỏ hoặc các dịch vụ vi mô (microservice).
- Linh hoạt: Thiết kế Slim cho phép tích hợp dễ dàng với bất kỳ thư viện hoặc thành phần bên thứ ba nào như engine template, ORM, thư viện xác thực... Bạn có thể tùy ý lựa chọn công cụ phù hợp nhất cho nhu cầu của dự án.
- Dễ sử dụng: API rõ ràng, tài liệu đầy đủ giúp lập trình viên làm quen và phát triển dự án một cách nhanh chóng.
- Routing mạnh: Hỗ trợ đầy đủ các phương thức HTTP (GET, POST, PUT, DELETE...) và cấu hình route phức tạp như nhóm route, middleware, bắt tham số động.
- Hỗ trợ Middleware: Tầng middleware của Slim cho phép bạn thực thi các tác vụ như xác thực, logging, kiểm soát CORS... trước khi vào logic của ứng dụng hoặc trước khi trả về response tới client.
Slim cực kỳ phù hợp để xây dựng RESTful API, phát triển nhanh prototype và triển khai các chức năng độc lập chuyên biệt.
Tạo và chạy dự án Slim với ServBay
Hướng dẫn này sẽ sử dụng môi trường PHP đã cấu hình sẵn của ServBay cùng tính năng Website để thiết lập máy chủ web và truy cập dự án Slim chỉ với vài thao tác cấu hình đơn giản.
Các yêu cầu trước khi bắt đầu
Bạn cần chuẩn bị những bước sau trước khi tiến hành:
- Cài đặt và chạy ServBay: Đảm bảo ServBay đã được cài đặt thành công trên máy macOS hoặc Windows, và ứng dụng ServBay đang hoạt động.
- ServBay tích hợp Composer: Composer đã được ServBay cài sẵn, bạn không cần cài đặt riêng biệt.
Tạo dự án Slim
ServBay khuyến nghị bạn nên đặt toàn bộ mã nguồn các dự án website vào vị trí sau để dễ dàng quản lý và cấu hình:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
Di chuyển đến thư mục gốc website của ServBay:
macOS:
bashcd /Applications/ServBay/www
1Windows:
cmdcd C:\ServBay\www
1Tạo thư mục dự án mới: Khởi tạo một thư mục để chứa mã nguồn Slim.
bashmkdir servbay-slim-app
1Chuyển vào thư mục dự án:
bashcd servbay-slim-app
1Cài đặt Slim thông qua Composer: Trong thư mục dự án, chạy lệnh cài Slim cùng thư viện PSR-7.
bashcomposer require slim/slim "^4.0" slim/psr7 -W
1Lệnh này sẽ tải về Slim và
slim/psr7
vào thư mụcvendor
của dự án, đồng thời tạo filecomposer.json
vàcomposer.lock
.
Khởi tạo ứng dụng Slim
- Tạo file entry point: Dự án Slim thường sử dụng một file duy nhất (ví dụ
public/index.php
) để xử lý mọi request. Tạo thư mụcpublic
và fileindex.php
bên trong.bashmkdir public touch public/index.php
1
2 - Chỉnh sửa file entry point: Mở file
public/index.php
và thêm đoạn mã sau:phpĐây là ví dụ ứng dụng Slim đơn giản nhất: định nghĩa route cho GET tới URL gốc (<?php // Nạp file autoload của Composer require __DIR__ . '/../vendor/autoload.php'; // Import các interface PSR-7 và factory của Slim use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; // Khởi tạo ứng dụng Slim $app = AppFactory::create(); // Thêm route cơ bản cho request GET tới đường dẫn gốc '/' $app->get('/', function (Request $request, Response $response, $args) { // Ghi nội dung ra body của response $response->getBody()->write("Hello ServBay!"); // Trả về đối tượng response return $response; }); // Chạy ứng dụng 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/
) và trả về chuỗi "Hello ServBay!".
Cấu hình Website trên ServBay
Để truy cập dự án Slim qua trình duyệt, bạn cần cấu hình Website (hoặc “Host” với bản ServBay cũ).
- Mở giao diện ứng dụng ServBay.
- Điều hướng tới phân mục Website.
- Nhấn để thêm một website mới.
- Điền thông tin dựa theo dự án của bạn:
Tên (Name):
My First Slim Dev Site
(hoặc tên tùy ý)Tên miền (Domain):
servbay-slim-test.local
(nên dùng đuôi.local
hoặc.test
cho môi trường local)Loại website (Website Type):
PHP
Phiên bản PHP (PHP Version): Chọn phiên bản PHP mà bạn muốn, ví dụ
8.3
.Thư mục gốc (Document Root): Duyệt và chọn thư mục
public
trong dự án:- macOS:
/Applications/ServBay/www/servbay-slim-app/public
- Windows:
C:\ServBay\www\servbay-slim-app\public
Bởi vì file entry point
index.php
nằm trong thư mụcpublic
, server cần trỏ request tại đây.- macOS:
- Lưu lại cấu hình website. ServBay sẽ tự động cập nhật cấu hình máy chủ web.
Xem hướng dẫn chi tiết cấu hình Thêm website đầu tiên.
Truy cập website Slim của bạn
Sau khi cấu hình hoàn thành, hãy mở trình duyệt và truy cập tên miền bạn vừa thiết lập: https://servbay-slim-test.local
.
Nếu mọi thứ đúng, trên trình duyệt sẽ hiển thị dòng chữ Hello ServBay!
. Như vậy dự án Slim của bạn đã chạy thành công trên ServBay.
Tích hợp cơ sở dữ liệu
Slim Framework không kèm lớp truy vấn database nhưng có thể tích hợp dễ dàng với nhiều thư viện PHP database khác nhau. Trong ví dụ này, chúng ta sẽ dùng Eloquent ORM từ Laravel (illuminate/database
) để kết nối MySQL và PostgreSQL, đồng thời demo tích hợp Memcached và Redis.
Yêu cầu: Tạo database và migrate
Trước khi tích hợp database, bạn cần tạo mới database trong ServBay và dựng cấu trúc bảng cho ứng dụng.
- Tạo database:
- Mở ứng dụng ServBay, vô mục Software Package database (MySQL hoặc PostgreSQL).
- Dùng công cụ quản lý do ServBay cung cấp (phpMyAdmin cho MySQL/MariaDB, pgAdmin cho PostgreSQL) hoặc CLI để tạo một database mới, ví dụ đặt tên
servbay_slim_app
. - Mật khẩu mặc định của user root là
password
, có thể xem hoặc đổi trên ServBay.
- Cài đặt và cấu hình Phinx (tool migrate database): Phinx giúp quản lý version của cấu trúc database.
- Ở thư mục gốc dự án Slim, cài đặt Phinx qua Composer:
- macOS:
/Applications/ServBay/www/servbay-slim-app
- Windows:
C:\ServBay\www\servbay-slim-app
bashcomposer require robmorgan/phinx
1 - macOS:
- Khởi tạo file cấu hình Phinx:bashLệnh này sẽ tạo file
vendor/bin/phinx init
1phinx.yml
. Chỉnh thông tin kết nối database như sau:yamlpaths: migrations: '%%PHINX_CONFIG_DIR%%/db/migrations' seeds: '%%PHINX_CONFIG_DIR%%/db/seeds' environments: default_migration_table: phinxlog default_environment: development # hoặc tên môi trường bạn chọn development: # chỉnh adapter theo loại database của bạn adapter: mysql # hoặc pgsql host: 127.0.0.1 name: servbay_slim_app # tên DB vừa tạo user: root pass: password # mật khẩu database port: 3306 # MySQL mặc định, PostgreSQL là 5432 charset: utf8mb4 # (nên cho MySQL) collation: utf8mb4_unicode_ci # (nên cho MySQL) version_order: creation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- Ở thư mục gốc dự án Slim, cài đặt Phinx qua Composer:
- Tạo file migration: Dùng Phinx lệnh tạo migration mới.bashLệnh tạo một file PHP trong
vendor/bin/phinx create CreateUsersTable
1db/migrations
. Mở file đó và định nghĩa bảngusers
ở hàmchange()
: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() // Tạo trường created_at và 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
28 - Chạy migrate: Ở thư mục dự án, chạy lệnh sau để tạo bảng
users
:bashLưu ý: Trước khi thử các ví dụ tích hợp database, bạn cần hoàn thành các bước tạo database và migrate này.vendor/bin/phinx migrate
1
Sử dụng component illuminate/database (Laravel)
Sử dụng package database của Laravel (illuminate/database
) làm ORM và query builder.
Cài đặt illuminate/database: Ở thư mục gốc dự án, chạy:
- macOS:
/Applications/ServBay/www/servbay-slim-app
- Windows:
C:\ServBay\www\servbay-slim-app
bashcomposer require illuminate/database
1- macOS:
Khởi tạo kết nối database trong
public/index.php
: Sau lệnhrequire __DIR__ . '/../vendor/autoload.php';
, trước khi tạo Slim app với$app = AppFactory::create();
, thêm đoạn cấu hình sau.php// ... Các lệnh require và use khác ... use Illuminate\Database\Capsule\Manager as Capsule; // Import Capsule // Khởi tạo Eloquent ORM $capsule = new Capsule; // Thêm cấu hình kết nối database (đổi driver và tham số nếu dùng loại khác) $capsule->addConnection([ 'driver' => 'mysql', // hoặc 'pgsql' 'host' => '127.0.0.1', 'database' => 'servbay_slim_app', // tên database 'username' => 'root', // user 'password' => 'password', // mật khẩu 'charset' => 'utf8mb4', // khuyến nghị cho MySQL 'collation' => 'utf8mb4_unicode_ci', // khuyến nghị cho MySQL 'prefix' => '', // PostgreSQL cần thêm thông tin schema // 'schema' => 'public', ]); // Thiết lập global $capsule->setAsGlobal(); // Khởi động Eloquent $capsule->bootEloquent(); // ... Khởi tạo Slim app ($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
MySQL ví dụ
Giả sử bạn đã khởi động MySQL trên ServBay, tạo database servbay_slim_app
và đã migrate bảng users
.
Thêm các route sau vào public/index.php
, trước $app->run();
:
php
// ... Code khởi tạo và route '/' ...
use Illuminate\Database\Capsule\Manager as Capsule; // Đảm bảo đã import
// Route thêm user mới
$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', // Đảm bảo email unique
'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);
}
return $response;
});
// Route lấy danh sách user
$app->get('/mysql-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
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
Truy cập:
- Truy cập
https://servbay-slim-test.local/mysql-add-user
để thêm một user vào bảngusers
. - Truy cập
https://servbay-slim-test.local/mysql-get-users
để lấy danh sách user ở dạng JSON.
PostgreSQL ví dụ
Giả sử bạn đã khởi động PostgreSQL, tạo database servbay_slim_app
và migrate bảng users
(nhớ chỉnh cấu hình Phinx với adapter
là pgsql
và port
là 5432
).
Chỉnh phần cấu hình connection trong public/index.php
; chuyển driver
sang pgsql
và thêm trường schema
:
php
$capsule->addConnection([
'driver' => 'pgsql', // sử dụng pgsql
'host' => '127.0.0.1',
'database' => 'servbay_slim_app',
'username' => 'root',
'password' => 'password',
'charset' => 'utf8', // PostgreSQL thường dùng utf8
'prefix' => '',
'schema' => 'public', // cần chỉ rõ schema
]);
// ... Phần khởi tạo Eloquent giữ nguyên ...
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Thêm route sau vào public/index.php
trước $app->run();
:
php
// ... Code khởi tạo và route '/' ...
// ... Route ví dụ MySQL (nếu cần) ...
use Illuminate\Database\Capsule\Manager as Capsule; // Đảm bảo đã import
// Route thêm user vào 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', // Đảm bảo email unique
'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 lấy danh sách user từ 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
Truy cập:
- Truy cập
https://servbay-slim-test.local/pgsql-add-user
để thêm user vào bảng của PostgreSQL. - Truy cập
https://servbay-slim-test.local/pgsql-get-users
để lấy danh sách user của PostgreSQL dạng JSON.
Memcached ví dụ
ServBay cung cấp gói Memcached và extension ext-memcached
cho PHP. Bạn chỉ cần cài thêm thư viện client PHP, ở đây dùng memcached/memcached
.
Cài client Memcached: Ở thư mục dự án, chạy:
- macOS:
/Applications/ServBay/www/servbay-slim-app
- Windows:
C:\ServBay\www\servbay-slim-app
bashcomposer require memcached/memcached
1- macOS:
Thêm route Memcached vào
public/index.php
: Thêm trước$app->run();
:php// ... Code khởi tạo database và các route trước ... // Route ví dụ sử dụng Memcached $app->get('/memcached-example', function (Request $request, Response $response, $args) { // Tạo instance của Memcached client $memcached = new Memcached(); // Thêm server Memcached (ServBay chạy trên 127.0.0.1:11211) $memcached->addServer('127.0.0.1', 11211); $cacheKey = 'my_servbay_cache_key'; // Kiểm tra dữ liệu cache $cachedData = $memcached->get($cacheKey); if ($cachedData === false) { // Nếu chưa có cache, tạo và ghi vào cache $cachedData = 'Hello Memcached from ServBay! This was not cached.'; // Lưu cache với thời gian sống 60 giây $memcached->set($cacheKey, $cachedData, 60); $response->getBody()->write($cachedData); } else { // Nếu đã có cache, trả về dữ liệu đã 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
28
Truy cập: Truy cập https://servbay-slim-test.local/memcached-example
. Lần đầu tiên sẽ hiện "This was not cached.", truy cập lại (trong thời gian cache) sẽ hiện "This was served from cache.".
Redis ví dụ
ServBay cung cấp Redis và extension ext-redis
cho PHP. Bạn chỉ cần cài thêm client PHP, ở đây dùng predis/predis
.
Cài client Redis: Ở thư mục dự án, chạy:
- macOS:
/Applications/ServBay/www/servbay-slim-app
- Windows:
C:\ServBay\www\servbay-slim-app
bashcomposer require predis/predis
1- macOS:
Thêm route Redis vào
public/index.php
, trước$app->run();
:php// ... Code khởi tạo database, Memcached và các route trước ... use Predis\Client as RedisClient; // Import client lớp Predis // Route ví dụ sử dụng Redis $app->get('/redis-example', function (Request $request, Response $response, $args) { try { // Tạo Redis client (ServBay chạy trên 127.0.0.1:6379) $redis = new RedisClient([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379, ]); $cacheKey = 'my_servbay_redis_cache_key'; // Lấy dữ liệu cache $cachedData = $redis->get($cacheKey); if ($cachedData === null) { // Nếu chưa có cache, tạo và ghi vào Redis $cachedData = 'Hello Redis from ServBay! This was not cached.'; // Lưu cache với thời gian sống là 60 giây $redis->setex($cacheKey, 60, $cachedData); // SETEX key seconds value $response->getBody()->write($cachedData); } else { // Nếu đã có cache, trả về dữ liệu đã cache $response->getBody()->write('Hello Redis from ServBay! This was served from cache.'); } } catch (\Exception $e) { // Bắt lỗi kết nối hoặc thao tác $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
Truy cập: Truy cập https://servbay-slim-test.local/redis-example
. Lần đầu sẽ xuất hiện "This was not cached.", những lần sau (trong thời gian cache) sẽ hiện "This was served from cache.".
Tổng kết
Qua các bước trên, bạn đã tạo thành công một dự án Slim Framework trên môi trường phát triển cục bộ ServBay và cấu hình tính năng Website để host và truy cập dự án. Bạn cũng đã biết cách tận dụng các Software Package như MySQL, PostgreSQL, Memcached, Redis và các extension PHP để tích hợp cơ sở dữ liệu và cache vào ứng dụng Slim một cách dễ dàng. ServBay đơn giản hóa quá trình dựng môi trường, giúp bạn tập trung tối đa vào việc phát triển ứng dụng Slim.