Restful Slim Framework and Medoo

1.Setup và cấu hình database
Các bạn setup Slim Framework theo hướng dẫn của mình ở đây
Tiếp theo các bạn setup Medoo:

composer require catfan/medoo

Tạo table tên là articles

-- --------------------------------------------------------
-- Host:                         192.168.142.128
-- Server version:               5.6.47 - MySQL Community Server (GPL)
-- Server OS:                    Linux
-- HeidiSQL Version:             10.2.0.5717
-- --------------------------------------------------------

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

-- Dumping structure for table demo.articles
DROP TABLE IF EXISTS `articles`;
CREATE TABLE IF NOT EXISTS `articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `created_date` datetime DEFAULT NULL,
  `updated_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Dumping data for table demo.articles: ~0 rows (approximately)
DELETE FROM `articles`;
/*!40000 ALTER TABLE `articles` DISABLE KEYS */;
INSERT INTO `articles` (`id`, `title`, `created_date`, `updated_date`) VALUES
	(5, 'amod Dịch COVID-19 tác động đến các lĩnh vực xã hội như thế nào?', '2020-03-25 11:56:59', '2020-03-25 04:27:28'),
	(6, 'Tình hình sức khoẻ 3 bệnh nhân mắc Covid-19 nặng hiện nay ra sao?', NULL, NULL),
	(7, 'Sau lệnh cấm, nhiều người vẫn lén ném đồ tiếp tế qua hàng rào ở KTX ĐH Quốc gia TP. HCM', '2020-03-25 03:54:56', NULL),
	(8, 'Gửi bún chả, bánh chưng, hoa quả, bia... vào khu cách ly cho người thân ở Hà Nội', '2020-03-25 03:55:42', NULL),
	(9, 'Bệnh nhân 11 tuổi ở Hải Dương đã âm tính lần 1 với Covid-19', '2020-03-25 03:56:01', NULL),
	(10, 'Thứ trưởng Bộ Y tế Nguyễn Trường Sơn: "Suốt ngày quần quật trong khoa, chắc chắn có lúc sơ hở"', '2020-03-25 03:56:27', NULL),
	(11, 'Lùi lịch thi THPT quốc gia, xét tuyển đại học thay đổi ra sao?', '2020-03-25 03:56:47', NULL),
	(12, 'Chủ tịch Hà Nội: Diễn biến dịch đã phức tạp hơn, có lây nhiễm chéo của bác sĩ từ bệnh nhân điều trị', '2020-03-25 03:58:00', NULL),
	(13, 'Bệnh nhân số 133 từng khám ở Bệnh viện Bạch Mai, được đưa về Lai Châu bằng xe cứu thương', '2020-03-25 03:58:20', NULL),
	(14, 'Trường hợp khẩn cấp ở nước ngoài, làm sao để trở về nhà?', '2020-03-25 03:58:25', NULL);
/*!40000 ALTER TABLE `articles` ENABLE KEYS */;

/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

Tạo file tên DbHandler.php và cấu hình kết nối tới database:

<?php
use Medoo\Medoo;

class DbHandler
{

    private $conn;

    public function __construct()
    {
        $database = new Medoo([
            'database_type' => 'mysql',
            'database_name' => 'demo',
            'server'        => '192.168.142.128',
            'username'      => 'root',
            'password'      => '1281988',
        ]);
        // opening db connection
        $this->conn = $database;
    }
}

Include file vào index.php trước dòng require __DIR__ . ‘/vendor/autoload.php’;

include 'DbHandler.php';

2.Tạo các route và model:
Các route sẽ tạo ở file index.php:

Name Description
$app->get(‘/articles’) List articles
$app->get(‘/articles/{article}’) Show one detail articles
$app->post(‘/articles’) Insert articles
$app->put(‘/articles’) Update articles
$app->delete(‘/articles/{article}’) Delete articles

Tạo route $app->get(‘/articles’)

$app->get('/articles', function (Request $request, Response $response, $args) {
	$db = new DbHandler();
	$total_records =$db->totalRow();
	$current_page = isset($_GET['page']) ? $_GET['page'] : 1;
    $limit = 5;
    $total_page = ceil($total_records / $limit);

    // Giới hạn current_page trong khoảng 1 đến total_page
    if ($current_page > $total_page){
        $current_page = $total_page;
    }
    else if ($current_page < 1){
        $current_page = 1;
    }
    $start = ($current_page - 1) * $limit;
    $result=$db->getAll($start,$limit);
    $result = array(
                    'info'        => '0',
                    'totalRecord' => $total_records,
                    'totalPage'   => $total_page,
                    'perPage'     => $limit,
                    'page'        => $current_page,
                    'data'        => $result,
                );
	$payload = json_encode($result);
	$response->getBody()->write($payload);
	return $response
	          ->withHeader('Content-Type', 'application/json');
});

Thêm 2 function vào file DbHandler.php

    public function getAll($start, $limit)
    {
        $result = $this->conn->select('articles', '*', [ 'ORDER' => ['id' => 'DESC'],"LIMIT" => [$start, $limit]]);
        return $result;
    }

    public function totalRow()
    {
        $result = $this->conn->count(
            'articles'
        );
        return $result;
    }

Tạo route $app->get(‘/articles/{article}’)

$app->get('/articles/{article}', function (Request $request, Response $response, $args) {
	$id = $args['article'];
	$db = new DbHandler();
	$result = $db->getOne($id);
	$payload = json_encode($result);
	$response->getBody()->write($payload);
	return $response
	          ->withHeader('Content-Type', 'application/json');
});

Thêm function vào file DbHandler.php

public function getOne($id)
    {
        $result = $this->conn->select(
            'articles',
            "*",
            array('id' => $id)
        );
        return $result;
    }

Tạo route $app->put(‘/articles’)

$app->put('/articles', function ($request, $response, $args) {
	$paramPut= $request->getBody()->getContents();
	$paramPut=json_decode($paramPut);
	$id=$paramPut->id;
	$title=trim($paramPut->title);
	$dataUpdate=[
		'title'=>$title,
		'updated_date'=>date('Y-m-d H:i:s')
	];
	$db = new DbHandler();
	$idInsert= $db->updateTitle($id,$dataUpdate);
	$result=['info'=>0,'message'=>'update success'];
	$payload = json_encode($result);
	$response->getBody()->write($payload);
	return $response
	          ->withHeader('Content-Type', 'application/json');
});

Thêm function vào file DbHandler.php

public function updateTitle($id,$data){
        $result = $this->conn->update(
            'articles',
            $data,
            array('id' => $id)
        );
        return 1;
    }

Tạo route $app->post(‘/articles’)

        $app->post('/articles', function ($request, $response, $args) {
	$data = $request->getParsedBody();
	$title=trim($data['title']);
	$data=[
		'title'=>$title,
		'created_date'=>date("Y-m-d H:i:s")
	];
	$db = new DbHandler();
	$idInsert= $db->insertTitle($data);
	$result=['info'=>0,'message'=>'insert success','last_id_insert'=>$idInsert];
	$payload = json_encode($result);
	$response->getBody()->write($payload);
	return $response
	          ->withHeader('Content-Type', 'application/json');
});

Thêm function vào file DbHandler.php

public function insertTitle($data)
    {
        $result = $this->conn->insert(
            'articles',
            $data
        );
        return $this->conn->id();
    }

Tạo route $app->delete(‘/articles/{article}’)

$app->delete('/articles/{article}', function ($request, $response, $args) {
	$id = $args['article'];
	$db = new DbHandler();
	$db->deleteTitle($id);
	$result=['info'=>0,'message'=>'delete success'];
	$payload = json_encode($result);
	$response->getBody()->write($payload);
	return $response
	          ->withHeader('Content-Type', 'application/json');
});

Thêm function vào file DbHandler.php

public function deleteTitle($id)
    {
        $result = $this->conn->delete(
            'articles',
            array('id' => $id)
        );
        return 1;
    }

File index.php hoàn chỉnh:

File DbHandler.php hoàn chỉnh:

Code Project in here

0 Shares

Leave a Reply

avatar
  Subscribe  
Notify of