Tạo và vận hành dự án Slim trong ServBay
Bài viết này sẽ hướng dẫn bạn cách nhanh chóng tạo mới, cấu hình và khởi chạy một dự án Slim Framework PHP thông qua môi trường phát triển web cục bộ mạnh mẽ ServBay. ServBay đã tích hợp sẵn PHP, các 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 cho việc phát triển với Slim Framework.
Slim là gì?
Slim là một PHP microframework gọn nhẹ, được thiết kế để xây dựng nhanh các ứng dụng web và API đơn giản nhưng mạnh mẽ. Nó cung cấp các chức năng cốt lõi về định tuyến, xử lý request và response, rất phù hợp cho những dự án cần phát triển và triển khai nhanh, hoặc làm nền tảng cho các ứng dụng phức tạp hơn.
Ưu điểm và tính năng nổi bật của Slim
- Gọn nhẹ: Code base của Slim rất nhỏ, tiêu thụ ít tài nguyên, khởi động nhanh, phù hợp cho các ứng dụng nhỏ đến trung bình hoặc microservice.
- Linh hoạt: Slim có tính mở rộng cao, dễ dàng tích hợp với bất kỳ thư viện, thành phần bên thứ ba nào (template engine, ORM, authentication, v.v), cho phép bạn lựa chọn công cụ phù hợp nhất với nhu cầu dự án.
- Dễ sử dụng: Với API ngắn gọn, tài liệu rõ ràng, lập trình viên có thể nhanh chóng nắm bắt và bắt đầu phát triển.
- Khả năng định tuyến mạnh mẽ: Hỗ trợ nhiều phương thức HTTP (GET, POST, PUT, DELETE...), định tuyến phức tạp, group routes, middleware, tham số động...
- Hỗ trợ middleware: Lớp middleware cho phép thực hiện các tác vụ trước khi request được xử lý hoặc trước khi response trả về client, như xác thực, logging, xử lý CORS...
Slim rất phù hợp để xây dựng RESTful API, phát triển prototype nhanh và triển khai các chức năng nhỏ, độc lập.
Tạo và chạy dự án Slim với ServBay
Hướng dẫn này sẽ tận dụng môi trường PHP được cấu hình sẵn từ ServBay cùng tính năng Websites để thiết lập máy chủ web, giúp bạn truy cập dự án Slim một cách thuận tiện.
Yêu cầu chuẩn bị
Trước khi bắt đầu, hãy đảm bảo bạn đã:
- Cài đặt và chạy ServBay: Đảm bảo ServBay đã được cài trên macOS của bạn và ứng dụng đang hoạt động.
- ServBay tích hợp Composer: Composer đã được tích hợp mặc định trong ServBay, không cần cài đặt thêm.
Tạo dự án Slim
ServBay khuyến khích lưu toàn bộ source dự án tại thư mục /Applications/ServBay/www
để dễ quản lý và cấu hình.
- Di chuyển vào thư mục gốc website của ServBay:bash
cd /Applications/ServBay/www
1 - Tạo thư mục dự án: Tạo thư mục mới cho dự án Slim.bash
mkdir servbay-slim-app
1 - Chuyển vào thư mục dự án:bash
cd servbay-slim-app
1 - Cài đặt Slim bằng Composer: Thực hiện cài đặt Slim và PSR-7 implementation.bashLệnh này sẽ cài đặt Slim Framework và thư viện
composer require slim/slim "^4.0" slim/psr7 -W
1slim/psr7
vào thư mụcvendor
cũng như tạo filecomposer.json
,composer.lock
.
Khởi tạo ứng dụng Slim
- Tạo file entry point: Slim thường dùng một file duy nhất (như
public/index.php
) để xử lý toàn bộ request. Hãy tạo thư mụcpublic
và fileindex.php
bên trong:bashmkdir public touch public/index.php
1
2 - Soạn nội dung cho file entry: Mở
public/index.php
và thêm đoạn code Slim cơ bản:phpĐoạn code trên thiết lập một ứng dụng Slim cơ bản với route GET tới đường dẫn gốc<?php // Nạp file autoload của Composer require __DIR__ . '/../vendor/autoload.php'; // Import các interface PSR-7 và class Slim Factory 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(); // Định nghĩa route cơ bản: xử lý GET với path '/' $app->get('/', function (Request $request, Response $response, $args) { // Ghi dữ liệu ra body response $response->getBody()->write("Hello ServBay!"); // Trả về response object 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/
, trả về chuỗi "Hello ServBay!".
Cấu hình Website trong ServBay
Để truy cập dự án Slim qua trình duyệt, bạn cần cấu hình một Website (trong các bản cũ gọi là “Hosts”).
- Mở giao diện ứng dụng ServBay.
- Điều hướng tới module Websites.
- Chọn thêm mới một website.
- Điền thông tin cấu hình dự án:
- Tên (Name):
My First Slim Dev Site
(hoặc tùy chọn theo ý bạn) - Tên miền (Domain):
servbay-slim-test.local
(nên kết thúc bằng.local
hoặc.test
khi phát triển cục bộ) - Loại website (Website Type):
PHP
- Phiên bản PHP (PHP Version): Chọn, ví dụ
8.3
. - Thư mục gốc website (Document Root): Chọn thư mục
public
của bạn:/Applications/ServBay/www/servbay-slim-app/public
(do fileindex.php
nằm trong đây, web server cần trỏ tới đúng thư mục này).
- Tên (Name):
- Lưu cấu hình. ServBay sẽ tự động cập nhật cấu hình máy chủ web và áp dụng ngay.
Tham khảo hướng dẫn chi tiết tại Thêm website đầu tiên.
Truy cập website Slim của bạn
Hoàn thành cấu hình, hãy mở trình duyệt và vào đường dẫn https://servbay-slim-test.local
.
Nếu mọi thứ đúng, bạn sẽ thấy trang hiển thị chữ Hello ServBay!
. Điều này xác nhận trang Slim của bạn đã chạy thành công thông qua máy chủ Web của ServBay.
Tích hợp cơ sở dữ liệu (Ví dụ)
Slim Framework không bao gồm sẵn tầng trừu tượng dữ liệu, nhưng dễ dàng tích hợp với các thư viện PHP cho cơ sở dữ liệu. Dưới đây ví dụ với ORM Eloquent của Laravel (illuminate/database
) để kết nối MySQL, PostgreSQL, cũng như hướng dẫn tích hợp Memcached và Redis.
Yêu cầu: Tạo database và chạy migration
Trước khi tích hợp database, hãy tạo sẵn cơ sở dữ liệu trong ServBay và thiết lập cấu trúc bảng cho ứng dụng.
- Tạo database:
- Truy cập giao diện ServBay, điều hướng tới gói database bạn sử dụng (MySQL hoặc PostgreSQL).
- Qua các công cụ như phpMyAdmin (cho MySQL/MariaDB), pgAdmin (cho PostgreSQL), hoặc dùng CLI để tạo database, ví dụ đặt tên
servbay_slim_app
. - Mật khẩu mặc định cho user root thường là
password
, có thể xem hoặc đổi từ ServBay.
- Cài đặt và cấu hình Phinx (tool migrate database): Phinx giúp quản lý phiên bản cho cấu trúc CSDL.
- Trong thư mục dự án
/Applications/ServBay/www/servbay-slim-app
, chạy:bashcomposer require robmorgan/phinx
1 - Khởi tạo file cấu hình Phinx:bashThao tác này tạo file
vendor/bin/phinx init
1phinx.yml
ở thư mục gốc dự án. Chỉnh sửa file này để cấu hình kết nối với CSDL, ví dụ: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: # Tùy chỉnh theo loại database adapter: mysql # Hoặc pgsql host: 127.0.0.1 name: servbay_slim_app # Tên database đã tạo user: root pass: password # Pass database port: 3306 # Mặc định MySQL, PostgreSQL mặc định là 5432 charset: utf8mb4 # Nên chọn cho MySQL collation: utf8mb4_unicode_ci # Nên chọ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
- Trong thư mục dự án
- Tạo file migration: Dùng lệnh Phinx để tạo migration mới.bashPhinx sẽ sinh file PHP trong thư mục
vendor/bin/phinx create CreateUsersTable
1db/migrations
. Mở file đó, điền vào hàmchange()
cấu trúc bảngusers
: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() // Thêm trường created_at & 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 - Thực thi migration: Ở thư mục root dự án, chạy lệnh migrate để tạo bảng
users
.bashLưu ý: Phải hoàn thành bước này trước khi chạy các đoạn code ví dụ với database bên dưới.vendor/bin/phinx migrate
1
Sử dụng gói illuminate/database
Chúng ta sẽ dùng package illuminate/database
của Laravel như ORM và query builder.
Cài đặt illuminate/database: Từ thư mục dự án:
bashcomposer require illuminate/database
1Khởi tạo kết nối database trong
public/index.php
: Thêm đoạn sau vào saurequire __DIR__ . '/../vendor/autoload.php';
, trước$app = AppFactory::create();
.php// ... require & use các thư viện khác ... use Illuminate\Database\Capsule\Manager as Capsule; // Import Capsule // Khởi tạo Eloquent ORM $capsule = new Capsule; // Thiết lập cấu hình database (chỉnh driver, tham số tương ứng) $capsule->addConnection([ 'driver' => 'mysql', // hoặc 'pgsql' 'host' => '127.0.0.1', 'database' => 'servbay_slim_app', // Tên database 'username' => 'root', 'password' => 'password', 'charset' => 'utf8mb4', // Cho MySQL 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', // PostgreSQL thêm schema nếu cần // 'schema' => 'public', ]); // Sử dụng toàn cục $capsule->setAsGlobal(); // Kích hoạt Eloquent $capsule->bootEloquent(); // ... Tiếp theo là tạo $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
Ví dụ với MySQL
Giả sử bạn đã bật MySQL trong ServBay, tạo database servbay_slim_app
và migrate thành công bảng users
.
Trong public/index.php
, trước khi $app->run();
, thêm các route sau:
// ... Khởi tạo như hướng dẫn/trước route '/'
use Illuminate\Database\Capsule\Manager as Capsule; // Bảo đảm đã 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 dữ liệu users
$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();
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 user vào bảngusers
. - Truy cập
https://servbay-slim-test.local/mysql-get-users
để lấy danh sách người dùng dưới dạng JSON.
Ví dụ với PostgreSQL
Giả sử PostgreSQL đã bật, database servbay_slim_app
đã được tạo cùng với bảng users
sau khi migrate (đảm bảo Phinx dùng adapter
và port
phù hợp).
Hiệu chỉnh cấu hình kết nối trong public/index.php
, đổi driver sang pgsql
và thêm schema
:
$capsule->addConnection([
'driver' => 'pgsql',
'host' => '127.0.0.1',
'database' => 'servbay_slim_app',
'username' => 'root',
'password' => 'password',
'charset' => 'utf8',
'prefix' => '',
'schema' => 'public',
]);
// ... các khởi tạo Eloquent khác giữ nguyên ...
2
3
4
5
6
7
8
9
10
11
Trong public/index.php
, trước khi $app->run();
, thêm:
// ... các khởi tạo trước và các route MySQL (nếu có) ...
use Illuminate\Database\Capsule\Manager as Capsule; // Đảm bảo đã import
// Route thêm user mới cho 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',
'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 cho 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();
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/pgsql-add-user
để thêm user vào bảngusers
trong PostgreSQL. - Truy cập
https://servbay-slim-test.local/pgsql-get-users
để lấy danh sách dưới dạng JSON.
Ví dụ với Memcached
ServBay đã có sẵn gói Memcached và extension ext-memcached
cho PHP. Bạn chỉ cần cài thêm gói client PHP, ví dụ memcached/memcached
.
Cài đặt client PHP cho Memcached:
bashcomposer require memcached/memcached
1Thêm route sử dụng Memcached vào
public/index.php
trước$app->run();
:php// ... các khởi tạo ban đầu & các route database ... // Route test Memcached $app->get('/memcached-example', function (Request $request, Response $response, $args) { // Khởi tạo client Memcached mới $memcached = new Memcached(); // Thêm server (ServBay mặc định địa chỉ 127.0.0.1:11211) $memcached->addServer('127.0.0.1', 11211); $cacheKey = 'my_servbay_cache_key'; // Thử lấy dữ liệu từ cache $cachedData = $memcached->get($cacheKey); if ($cachedData === false) { // Nếu cache chưa có, sinh dữ liệu và lưu cache 60 giây $cachedData = 'Hello Memcached from ServBay! This was not cached.'; $memcached->set($cacheKey, $cachedData, 60); $response->getBody()->write($cachedData); } else { // Dữ liệu đã cache, trả về luôn $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
Truy cập: Vào https://servbay-slim-test.local/memcached-example
. Lần đầu sẽ hiện "This was not cached.", các lần sau (trước khi cache hết hạn) sẽ hiện "This was served from cache.".
Ví dụ với Redis
ServBay hỗ trợ Redis và PHP extension ext-redis
. Dùng package client PHP như predis/predis
.
Cài đặt Predis client:
bashcomposer require predis/predis
1Thêm route sử dụng Redis vào
public/index.php
trước$app->run();
:php// ... các khởi tạo và route database, memcached (nếu cần) ... use Predis\Client as RedisClient; // Import Predis // Route test Redis $app->get('/redis-example', function (Request $request, Response $response, $args) { try { // Tạo client Redis và kết nối (mặc định 127.0.0.1:6379) $redis = new RedisClient([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379, ]); $cacheKey = 'my_servbay_redis_cache_key'; // Thử lấy dữ liệu từ cache $cachedData = $redis->get($cacheKey); if ($cachedData === null) { // Chưa có dữ liệu, ghi mới vào cache, expire 60s $cachedData = 'Hello Redis from ServBay! This was not cached.'; $redis->setex($cacheKey, 60, $cachedData); // SETEX key seconds value $response->getBody()->write($cachedData); } else { $response->getBody()->write('Hello Redis from ServBay! This was served from cache.'); } } catch (\Exception $e) { // Xử lý lỗi khi kết nối/thao tác Redis $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
Truy cập: Truy cập https://servbay-slim-test.local/redis-example
. Lần đầu sẽ thông báo "This was not cached.", các lần tiếp (trước khi cache hết hạn) sẽ là "This was served from cache.".
Tổng kết
Sau khi hoàn thiện các bước trên, bạn đã hoàn tất tạo một dự án Slim Framework trên môi trường phát triển cục bộ ServBay, cấu hình đầy đủ chức năng Website để host và truy cập ứng dụng một cách trực quan. Bạn cũng đã nắm được cách tích hợp các gói phần mềm như MySQL, PostgreSQL, Memcached, Redis và các extension PHP liên quan để xây dựng và quản lý tầng dữ liệu cũng như cache cho ứng dụng Slim. ServBay giúp đơn giản hóa setup môi trường và quản lý dự án, để bạn có thể tập trung tối đa vào phát triển ứng dụng Slim hiệu quả.