Slim Framework là một microframework siêu nhẹ cho PHP, giúp bạn nhanh chóng xây dựng các ứng dụng web và API mạnh mẽ. Với sự đơn giản và dễ sử dụng, Slim ngày càng trở thành lựa chọn hàng đầu cho việc phát triển API và các ứng dụng web nhỏ, đặc biệt khi cần triển khai nhanh chóng. Mặc dù có thể tạo REST API bằng các framework khác như Laravel, Symfony hay CodeIgniter, Slim nổi bật nhờ sự tinh gọn và dễ học, phù hợp với các dự án ưu tiên tốc độ phát triển.
Logo Slim Framework giúp xây dựng REST API nhanh chóng
Slim hỗ trợ đầy đủ các phương thức HTTP (GET, POST, PUT, DELETE) và cung cấp cấu trúc URL linh hoạt với các route, middleware, body parser, template, flash message, encrypted cookie… Bài viết này sẽ hướng dẫn bạn từng bước để tạo một REST API đơn giản với Slim Framework.
Mục Lục
Bước 1: Cài đặt Slim Framework bằng Composer
Để bắt đầu, bạn cần cài đặt Slim Framework vào dự án của mình. Sử dụng Composer, trình quản lý gói phổ biến cho PHP, để thực hiện việc này.
Mở terminal và di chuyển đến thư mục bạn muốn tạo dự án. Sau đó, chạy lệnh sau:
composer create-project slim/slim-skeleton [ten-du-an-cua-ban]
Thay thế [ten-du-an-cua-ban] bằng tên thư mục bạn muốn đặt cho dự án của mình. Ví dụ: composer create-project slim/slim-skeleton my-api.
Sau khi cài đặt xong, bạn có thể khởi động ứng dụng bằng lệnh:
composer start
Truy cập http://localhost:8080 trên trình duyệt, bạn sẽ thấy giao diện mặc định của Slim 3, báo hiệu việc cài đặt thành công.
Giao diện mặc định sau khi cài đặt Slim Framework thành công
Bước 2: Thiết lập kết nối cơ sở dữ liệu (Database)
Slim Framework không tích hợp sẵn thư viện kết nối cơ sở dữ liệu. Bạn có thể tự do lựa chọn bất kỳ thư viện nào phù hợp với nhu cầu. Trong ví dụ này, chúng ta sẽ sử dụng MySQL và thư viện PDO (PHP Data Objects), một extension có sẵn trong PHP, cung cấp giao diện thống nhất để truy cập nhiều hệ quản trị cơ sở dữ liệu.
1. Tạo bảng dữ liệu
Đầu tiên, tạo một bảng trong cơ sở dữ liệu MySQL để lưu trữ dữ liệu. Ví dụ, chúng ta sẽ tạo bảng library (thư viện sách) với cấu trúc như sau:
CREATE TABLE IF NOT EXISTS `library` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY UNIQUE,
`book_name` varchar(100) NOT NULL,
`book_isbn` varchar(100) NOT NULL,
`book_category` varchar(100) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
Bảng này bao gồm các cột:
id: ID duy nhất của sách (khóa chính, tự động tăng).book_name: Tên sách.book_isbn: Mã ISBN của sách.book_category: Thể loại sách.
2. Kết nối Slim với cơ sở dữ liệu
Mở file src/settings.php và thêm cấu hình kết nối cơ sở dữ liệu vào mảng settings:
// Database connection settings
"db" => [
"host" => "localhost",
"dbname" => "your-database-name",
"user" => "your-mysql-user",
"pass" => "your-mysql-password"
],
Thay thế các giá trị your-database-name, your-mysql-user, và your-mysql-password bằng thông tin kết nối cơ sở dữ liệu của bạn.
Tiếp theo, mở file src/dependencies.php và cấu hình thư viện cơ sở dữ liệu PDO. Chúng ta sẽ chèn đối tượng cơ sở dữ liệu vào container bằng cách sử dụng dependency injection:
// PDO database library
$container['db'] = function ($c) {
$settings = $c->get('settings')['db'];
$pdo = new PDO("mysql:host=" . $settings['host'] . ";dbname=" . $settings['dbname'],
$settings['user'], $settings['pass']);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
return $pdo;
};
Đoạn code này tạo một instance của PDO, kết nối đến cơ sở dữ liệu với thông tin đã cấu hình trong settings.php và thiết lập các thuộc tính để xử lý lỗi và định dạng dữ liệu trả về.
Bước 3: Xây dựng các API endpoints
Bây giờ, chúng ta sẽ xây dựng các API endpoints để thực hiện các thao tác CRUD (Create, Read, Update, Delete) trên bảng library.
Dưới đây là danh sách các API endpoints chúng ta sẽ xây dựng:
| Method | URL | Action |
|---|---|---|
| GET | /books | Lấy danh sách tất cả sách trong thư viện |
| GET | /book/{id} | Lấy thông tin sách có ID tương ứng |
| POST | /book | Thêm mới một cuốn sách |
| PUT | /book/{id} | Cập nhật thông tin sách có ID tương ứng |
| DELETE | /book/{id} | Xóa sách có ID tương ứng |
1. Lấy danh sách tất cả sách (GET /books)
Mở file src/routes.php và thêm đoạn code sau để tạo route cho việc lấy danh sách sách:
use PsrHttpMessageResponseInterface as Response;
use PsrHttpMessageServerRequestInterface as Request;
$app->get('/books', function (Request $request, Response $response, array $args) {
$db = $this->get('db');
$sth = $db->prepare("SELECT * FROM library ORDER BY id");
$sth->execute();
$books = $sth->fetchAll();
$response->getBody()->write(json_encode($books));
return $response->withHeader('Content-Type', 'application/json');
});
Đoạn code này thực hiện truy vấn đến cơ sở dữ liệu, lấy tất cả các bản ghi từ bảng library, chuyển đổi kết quả thành định dạng JSON và trả về cho client.
Để kiểm tra API này, bạn có thể sử dụng trình duyệt hoặc các công cụ như Postman để gửi một yêu cầu GET đến địa chỉ http://localhost:8080/books.
Kết quả trả về khi gọi API lấy danh sách sách
2. Lấy thông tin một cuốn sách (GET /book/{id})
Thêm đoạn code sau vào file src/routes.php để tạo route cho việc lấy thông tin một cuốn sách theo ID:
$app->get('/book/{id}', function (Request $request, Response $response, array $args) {
$db = $this->get('db');
$sth = $db->prepare("SELECT * FROM library WHERE id = :id");
$sth->bindParam("id", $args['id']);
$sth->execute();
$book = $sth->fetch();
$response->getBody()->write(json_encode($book));
return $response->withHeader('Content-Type', 'application/json');
});
Đoạn code này sử dụng prepared statement để tránh SQL injection, lấy giá trị ID từ URL, truy vấn đến cơ sở dữ liệu để lấy thông tin sách có ID tương ứng, chuyển đổi kết quả thành định dạng JSON và trả về cho client.
Ví dụ, để lấy thông tin cuốn sách có ID là 1, bạn gửi một yêu cầu GET đến địa chỉ http://localhost:8080/book/1.
Kết quả trả về khi gọi API lấy thông tin một cuốn sách theo ID
3. Thêm mới một cuốn sách (POST /book)
Thêm đoạn code sau vào file src/routes.php để tạo route cho việc thêm mới một cuốn sách:
$app->post('/book', function (Request $request, Response $response, array $args) {
$db = $this->get('db');
$data = $request->getParsedBody();
$sql = "INSERT INTO library (book_name, book_isbn, book_category) VALUES (:book_name, :book_isbn, :book_category)";
$sth = $db->prepare($sql);
$sth->bindParam("book_name", $data['book_name']);
$sth->bindParam("book_isbn", $data['book_isbn']);
$sth->bindParam("book_category", $data['book_category']);
$sth->execute();
$data['id'] = $db->lastInsertId();
$response->getBody()->write(json_encode($data));
return $response->withHeader('Content-Type', 'application/json');
});
Đoạn code này lấy dữ liệu từ request body, sử dụng prepared statement để thêm một bản ghi mới vào bảng library, lấy ID của bản ghi vừa được thêm và trả về thông tin của bản ghi đó cho client.
Để thêm mới một cuốn sách, bạn cần sử dụng một công cụ như Postman để gửi một yêu cầu POST đến địa chỉ http://localhost:8080/book với các tham số book_name, book_isbn, và book_category trong body của request. Chọn định dạng x-www-form-urlencoded trong Postman.
Sử dụng Postman để gửi yêu cầu POST thêm mới một cuốn sách
4. Cập nhật thông tin một cuốn sách (PUT /book/{id})
Thêm đoạn code sau vào file src/routes.php để tạo route cho việc cập nhật thông tin một cuốn sách:
$app->put('/book/{id}', function (Request $request, Response $response, array $args) {
$db = $this->get('db');
$data = $request->getParsedBody();
$sql = "UPDATE library SET book_name=:book_name, book_isbn=:book_isbn, book_category=:book_category WHERE id=:id";
$sth = $db->prepare($sql);
$sth->bindParam("book_name", $data['book_name']);
$sth->bindParam("book_isbn", $data['book_isbn']);
$sth->bindParam("book_category", $data['book_category']);
$sth->bindParam("id", $args['id']);
$sth->execute();
$data['id'] = $args['id'];
$response->getBody()->write(json_encode($data));
return $response->withHeader('Content-Type', 'application/json');
});
Đoạn code này lấy dữ liệu từ request body và ID từ URL, sử dụng prepared statement để cập nhật thông tin của cuốn sách có ID tương ứng trong bảng library, và trả về thông tin đã được cập nhật cho client.
Để cập nhật thông tin một cuốn sách, bạn cần sử dụng một công cụ như Postman để gửi một yêu cầu PUT đến địa chỉ http://localhost:8080/book/{id} với các tham số book_name, book_isbn, và book_category trong body của request. Thay thế {id} bằng ID của cuốn sách bạn muốn cập nhật.
Sử dụng Postman để gửi yêu cầu PUT cập nhật thông tin sách
5. Xóa một cuốn sách (DELETE /book/{id})
Thêm đoạn code sau vào file src/routes.php để tạo route cho việc xóa một cuốn sách:
$app->delete('/book/{id}', function (Request $request, Response $response, array $args) {
$db = $this->get('db');
$sth = $db->prepare("DELETE FROM library WHERE id=:id");
$sth->bindParam("id", $args['id']);
$sth->execute();
$response->getBody()->write(json_encode(['message' => 'Book deleted successfully']));
return $response->withHeader('Content-Type', 'application/json');
});
Đoạn code này lấy ID từ URL, sử dụng prepared statement để xóa cuốn sách có ID tương ứng khỏi bảng library, và trả về một thông báo thành công cho client.
Để xóa một cuốn sách, bạn cần sử dụng một công cụ như Postman để gửi một yêu cầu DELETE đến địa chỉ http://localhost:8080/book/{id}. Thay thế {id} bằng ID của cuốn sách bạn muốn xóa.
Sử dụng Postman để gửi yêu cầu DELETE xóa sách
Kết luận
Bài viết này đã hướng dẫn bạn cách tạo một REST API đơn giản với Slim Framework, bao gồm cài đặt Slim, thiết lập kết nối cơ sở dữ liệu và xây dựng các API endpoints để thực hiện các thao tác CRUD. Slim Framework là một lựa chọn tuyệt vời cho các dự án nhỏ và vừa, đặc biệt khi bạn cần phát triển API một cách nhanh chóng và dễ dàng. Với tính linh hoạt và dễ sử dụng, Slim cho phép bạn tập trung vào việc xây dựng logic nghiệp vụ của ứng dụng mà không cần phải lo lắng về những phức tạp của một framework đồ sộ. Ngoài ra, bạn có thể tham khảo tài liệu chính thức của Slim Framework để tìm hiểu sâu hơn về các tính năng khác.
