Tìm hiểu Slim Framework qua ứng dụng thực tế
Slim Framework trong nghiệp vụ Saas

Tìm hiểu Slim Framework qua ứng dụng thực tế

Giới thiệu

Bài viết sau đây hướng dẫn bạn tạo 1 ứng dụng thực tế từ Slim Framework. Ứng dụng của chúng ta có những tính năng sau:

  • Liệt kê danh sách các tỉnh thành theo định dạng Json
  • Lấy dữ liệu 1 tỉnh thành theo id
  • Cập nhật dữ liệu 1 tỉnh thành theo id
  • Xóa 1 tỉnh thành theo id

Cài đặt Slim Framework cho dự án

Sử dụng đoạn mã sau để tạo project slim từ composer

$ php composer.phar create-project slim/slim-skeleton [my-app-name]

Khởi động mini webservice từ php runtime

$ cd [my-app-name]; php -S localhost:8080 -t public public/index.php

Loại bỏ “public” trong đường dẫn dịch vụ

Bạn tạo 1 file .htaccess tại thư mục root của project và sử dụng đoạn mã sau để loại bỏ “public” trong đường dẫn dịch vụ.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ public/index.php [QSA,L]

Cấu hình kết nối database

Mở file settings.php trong thư mục src và thêm block code cấu hình cơ sở dữ liệu như sau:

<?php
return [
    'settings' => [
        'displayErrorDetails' => true, // set to false in production
        'addContentLengthHeader' => false, // Allow the web server to send the content-length header

        // Renderer settings
        'renderer' => [
            'template_path' => __DIR__ . '/../templates/',
        ],

        // Monolog settings
        'logger' => [
            'name' => 'slim-app',
            'path' => isset($_ENV['docker']) ? 'php://stdout' : __DIR__ . '/../logs/app.log',
            'level' => \Monolog\Logger::DEBUG,
        ],

        // database settings
        'database'=> [
            'host'=> '127.0.0.1',
            'dbname' => 'web1',
            'user'=>'root',
            'pass'=>''
        ]
    ],
];

Sử dụng thư viện PDO của PHP để kết nối với dữ liệu qua DI bằng cách mở file src/dependencies.php khởi tạo:

$container['db'] = function ($c) {
    $db = $c['settings']['db'];
    $pdo = new PDO('mysql:host=' . $db['host'] . ';dbname=' . $db['dbname'] .';charset=utf8',
        $db['user'], $db['pass']);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    return $pdo;
};

Cần thêm chuỗi cấu hình charset = utf8 nếu không dữ liệu sẽ mất dấu.

Test kết nối database bằng cách sửa nội dung file src/routes.php

<?php

use Slim\Http\Request;
use Slim\Http\Response;

// Routes

$app->get('/', function (Request $request, Response $response, array $args) {
    var_dump($this->db);
});

Nếu màn hình hiển thị như vầy là ok

D:\project\web1\src\routes.php:9:
object(PDO)[41]

Tạo table cho database lưu trữ thông tin tỉnh thành

Tiếp tục chúng ta sẽ tạo table bằng cách import code sql sau:

-- phpMyAdmin SQL Dump
-- version 4.8.4
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1:3306
-- Generation Time: Apr 10, 2019 at 04:16 AM
-- Server version: 5.7.24
-- PHP Version: 7.2.14

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: `web1`
--

-- --------------------------------------------------------

--
-- Table structure for table `tinhthanh`
--

DROP TABLE IF EXISTS `tinhthanh`;
CREATE TABLE IF NOT EXISTS `tinhthanh` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ten` varchar(120) COLLATE utf8_unicode_ci NOT NULL,
  `code` int(2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=64 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Dumping data for table `tinhthanh`
--

INSERT INTO `tinhthanh` (`id`, `ten`, `code`) VALUES
(1, 'Hà Nội', 1),
(2, 'Hà Giang', 2),
(3, 'Cao Bằng', 4),
(4, 'Bắc Kạn', 6),
(5, 'Tuyên Quang', 8),
(6, 'Lào Cai', 10),
(7, 'Điện Biên', 11),
(8, 'Lai Châu', 12),
(9, 'Sơn La', 14),
(10, 'Yên Bái', 15),
(11, 'Hoà Bình', 17),
(12, 'Thái Nguyên', 19),
(13, 'Lạng Sơn', 20),
(14, 'Quảng Ninh', 22),
(15, 'Bắc Giang', 24),
(16, 'Phú Thọ', 25),
(17, 'Vĩnh Phúc', 26),
(18, 'Bắc Ninh', 27),
(19, 'Hải Dương', 30),
(20, 'Hải Phòng', 31),
(21, 'Hưng Yên', 33),
(22, 'Thái Bình', 34),
(23, 'Hà Nam', 35),
(24, 'Nam Định', 36),
(25, 'Ninh Bình', 37),
(26, 'Thanh Hóa', 38),
(27, 'Nghệ An', 40),
(28, 'Hà Tĩnh', 42),
(29, 'Quảng Bình', 44),
(30, 'Quảng Trị', 45),
(31, 'Thừa Thiên Huế', 46),
(32, 'Đà Nẵng', 48),
(33, 'Quảng Nam', 49),
(34, 'Quảng Ngãi', 51),
(35, 'Bình Định', 52),
(36, 'Phú Yên', 54),
(37, 'Khánh Hòa', 56),
(38, 'Ninh Thuận', 58),
(39, 'Bình Thuận', 60),
(40, 'Kon Tum', 62),
(41, 'Gia Lai', 64),
(42, 'Đắk Lắk', 66),
(43, 'Đắk Nông', 67),
(44, 'Lâm Đồng', 68),
(45, 'Bình Phước', 70),
(46, 'Tây Ninh', 72),
(47, 'Bình Dương', 74),
(48, 'Đồng Nai', 75),
(49, 'Bà Rịa - Vũng Tàu', 77),
(50, 'Hồ Chí Minh', 79),
(51, 'Long An', 80),
(52, 'Tiền Giang', 82),
(53, 'Bến Tre', 83),
(54, 'Trà Vinh', 84),
(55, 'Vĩnh Long', 86),
(56, 'Đồng Tháp', 87),
(57, 'An Giang', 89),
(58, 'Kiên Giang', 91),
(59, 'Cần Thơ', 92),
(60, 'Hậu Giang', 93),
(61, 'Sóc Trăng', 94),
(62, 'Bạc Liêu', 95),
(63, 'Cà Mau', 96);
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Cấu trúc đường dẫn cho web services

Chúng ta sẽ tạo các đương dẫn định nghĩa tài nguyên theo bảng sau:

Bảng định nghĩa Routes
Bảng định nghĩa Routes

 

1.Lấy nội dung tỉnh thành

$app->get('/tinh-thanh', function (Request $request, Response $response, array $args) {
    $db = $this->db->prepare('SELECT * FROM tinhthanh ORDER BY code ASC');
    $db->execute();
    $cities = $db->fetchAll();
    return $response->withJson($cities);
});

demo dữ liệu trả về từ http://web1.local/tinh-thanh

[{"id":"1","ten":"H\u00e0 N\u1ed9i","code":"1"},{"id":"2","ten":"H\u00e0 Giang","code":"2"},{"id":"3","ten":"Cao B\u1eb1ng","code":"4"},{"id":"4","ten":"B\u1eafc K\u1ea1n","code":"6"},{"id":"5","ten":"Tuy\u00ean Quang","code":"8"},{"id":"6","ten":"L\u00e0o Cai","code":"10"},{"id":"7","ten":"\u0110i\u1ec7n Bi\u00ean","code":"11"},{"id":"8","ten":"Lai Ch\u00e2u","code":"12"},{"id":"9","ten":"S\u01a1n La","code":"14"},{"id":"10","ten":"Y\u00ean B\u00e1i","code":"15"},{"id":"11","ten":"Ho\u00e0 B\u00ecnh","code":"17"},{"id":"12","ten":"Th\u00e1i Nguy\u00ean","code":"19"},{"id":"13","ten":"L\u1ea1ng S\u01a1n","code":"20"},{"id":"14","ten":"Qu\u1ea3ng Ninh","code":"22"},{"id":"15","ten":"B\u1eafc Giang","code":"24"},{"id":"16","ten":"Ph\u00fa Th\u1ecd","code":"25"},{"id":"17","ten":"V\u0129nh Ph\u00fac","code":"26"},{"id":"18","ten":"B\u1eafc Ninh","code":"27"},{"id":"19","ten":"H\u1ea3i D\u01b0\u01a1ng","code":"30"},{"id":"20","ten":"H\u1ea3i Ph\u00f2ng","code":"31"},{"id":"21","ten":"H\u01b0ng Y\u00ean","code":"33"},{"id":"22","ten":"Th\u00e1i B\u00ecnh","code":"34"},{"id":"23","ten":"H\u00e0 Nam","code":"35"},{"id":"24","ten":"Nam \u0110\u1ecbnh","code":"36"},{"id":"25","ten":"Ninh B\u00ecnh","code":"37"},{"id":"26","ten":"Thanh H\u00f3a","code":"38"},{"id":"27","ten":"Ngh\u1ec7 An","code":"40"},{"id":"28","ten":"H\u00e0 T\u0129nh","code":"42"},{"id":"29","ten":"Qu\u1ea3ng B\u00ecnh","code":"44"},{"id":"30","ten":"Qu\u1ea3ng Tr\u1ecb","code":"45"},{"id":"31","ten":"Th\u1eeba Thi\u00ean Hu\u1ebf","code":"46"},{"id":"32","ten":"\u0110\u00e0 N\u1eb5ng","code":"48"},{"id":"33","ten":"Qu\u1ea3ng Nam","code":"49"},{"id":"34","ten":"Qu\u1ea3ng Ng\u00e3i","code":"51"},{"id":"35","ten":"B\u00ecnh \u0110\u1ecbnh","code":"52"},{"id":"36","ten":"Ph\u00fa Y\u00ean","code":"54"},{"id":"37","ten":"Kh\u00e1nh H\u00f2a","code":"56"},{"id":"38","ten":"Ninh Thu\u1eadn","code":"58"},{"id":"39","ten":"B\u00ecnh Thu\u1eadn","code":"60"},{"id":"40","ten":"Kon Tum","code":"62"},{"id":"41","ten":"Gia Lai","code":"64"},{"id":"42","ten":"\u0110\u1eafk L\u1eafk","code":"66"},{"id":"43","ten":"\u0110\u1eafk N\u00f4ng","code":"67"},{"id":"44","ten":"L\u00e2m \u0110\u1ed3ng","code":"68"},{"id":"45","ten":"B\u00ecnh Ph\u01b0\u1edbc","code":"70"},{"id":"46","ten":"T\u00e2y Ninh","code":"72"},{"id":"47","ten":"B\u00ecnh D\u01b0\u01a1ng","code":"74"},{"id":"48","ten":"\u0110\u1ed3ng Nai","code":"75"},{"id":"49","ten":"B\u00e0 R\u1ecba - V\u0169ng T\u00e0u","code":"77"},{"id":"50","ten":"H\u1ed3 Ch\u00ed Minh","code":"79"},{"id":"51","ten":"Long An","code":"80"},{"id":"52","ten":"Ti\u1ec1n Giang","code":"82"},{"id":"53","ten":"B\u1ebfn Tre","code":"83"},{"id":"54","ten":"Tr\u00e0 Vinh","code":"84"},{"id":"55","ten":"V\u0129nh Long","code":"86"},{"id":"56","ten":"\u0110\u1ed3ng Th\u00e1p","code":"87"},{"id":"57","ten":"An Giang","code":"89"},{"id":"58","ten":"Ki\u00ean Giang","code":"91"},{"id":"59","ten":"C\u1ea7n Th\u01a1","code":"92"},{"id":"60","ten":"H\u1eadu Giang","code":"93"},{"id":"61","ten":"S\u00f3c Tr\u0103ng","code":"94"},{"id":"62","ten":"B\u1ea1c Li\u00eau","code":"95"},{"id":"63","ten":"C\u00e0 Mau","code":"96"}]

2.Lấy nội dung tỉnh thành theo id

$app->get('/tinh-thanh/{id}',function (Request $request, Response $response, array $args) {
    $db = $this->db->prepare('SELECT * FROM tinhthanh WHERE id=:id');
    $db->bindParam("id", $args['id']);
    $db->execute();
    $city = $db->fetchObject();
    return $response->withJson($city);
});

demo dữ liệu trả về từ link: http://web1.local/tinh-thanh/6

{
    "id": "6",
    "ten": "Lào Cai",
    "code": "10"
}

3.Thêm mới dữ liệu

$app->post('/tinh-thanh',function (Request $request, Response $response){
    $data = $request->getParsedBody();
    $city['cityName'] = filter_var($data['cityName']);
    $city['code'] = filter_var($data['code']);
    $sql = 'INSERT INTO tinhthanh (`ten`, `code`) VALUES (:cityName, :code)';
    $db = $this->db->prepare($sql);
    $db->bindParam('cityName',$city['cityName']);
    $db->bindParam('code',$city['code']);
    $db->execute();
    $input['id'] = $this->db->lastInsertId();
    return $this->response->withJson($input);
});

4. Câp nhật dữ liệu

$app->put('tinh-thanh/{id}',function (Request $request, Response $response, array $args){
    $sql = 'UPDATE tinhthanh SET ten=:cityName, code = :code WHERE id=:id';
    $db = $this->db->prepare($sql);


    $data = $request->getParsedBody();
    $city['cityName'] = filter_var($data['cityName']);
    $city['code'] = filter_var($data['code']);

    $db->bindParam('id',$args['id']);
    $db->bindParam('cityName',$city['cityName']);
    $db->bindParam('code', $city['code']);
    $db->execute();
    $input['id'] = $args['id'];
    return $this->response->withJson($input);
});

5. Xóa dữ liệu theo id

$app->delete('/tinh-thanh/{id}', function (Request $request, Response $response, array $args) {
    $sth = $this->db->prepare("DELETE FROM tinhthanh WHERE id=:id");
    $sth->bindParam('id', $args['id']);
    $sth->execute();
    return $this->response->withJson(200);
});

 

 

Trả lời

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.

Close Menu
×
×

Cart