DLight Docs PHP 8+
Version: 20260401-dev

CRUD bảng users với pdo_mysql theo style DLight

Mục tiêu: làm CRUD nhanh theo đúng flow của DLight: Router -> Controller -> Model.

1) Chuẩn bị DB test

CREATE DATABASE IF NOT EXISTS test
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

USE test;

CREATE TABLE IF NOT EXISTS users (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  email VARCHAR(150) NOT NULL UNIQUE,
  password VARCHAR(255) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

2) Cấu hình DLight dùng pdo_mysql

Sửa config/database.php:

<?php

return [
    'db_driver' => 'pdo_mysql',
    'db_design' => 'builder', // hoặc mapper

    'db_name' => 'test',
    'db_host' => 'localhost',
    'db_port' => 3306,
    'db_user' => 'root',
    'db_pass' => '',
];

Và nhớ bật extension trong php.ini:

extension=pdo_mysql

3) Model app/Model/Users.php

<?php
namespace App\Model;

use DLight\Database\Traits\SoftDelete;

class Users extends Model
{
    use SoftDelete;

    protected $table = 'users';
    protected $selectable = ['id', 'name', 'email', 'created_at', 'updated_at'];
    protected $fillable = ['name', 'email', 'password'];
    protected $hidden = ['password'];
}

4) Controller CRUD app/Controller/UserController.php

<?php

namespace App\Controller;

use App\Model\Users;
use DLight\Application\DB;
use DLight\Application\Validator;

class UserController extends Controller
{
    private Users $users;

    public function __construct(Users $users)
    {
        $this->users = $users;
    }

    public function listUsers()
    {
        $users = Users::all();
        return json_encode(['data' => $users], JSON_UNESCAPED_UNICODE);
    }

    public function storeUser(Validator $validator)
    {
        $name = $_POST['name'] ?? '';
        $email = $_POST['email'] ?? '';
        $password = $_POST['password'] ?? '';

        $validator->make(
            ['name' => $name, 'email' => $email, 'password' => $password],
            ['name' => 'required|string|max:100', 'email' => 'required|email|max:150', 'password' => 'required|string|min:6']
        );

        if ($validator->fails()) {
            http_response_code(422);
            return json_encode(['error' => $validator->first()], JSON_UNESCAPED_UNICODE);
        }

        $this->users->insert([
            'name' => $name,
            'email' => $email,
            'password' => password_hash($password, PASSWORD_BCRYPT),
        ])->execute();

        return json_encode(['message' => 'created'], JSON_UNESCAPED_UNICODE);
    }

    public function showUser($id)
    {
        $user = $this->users->where('id', $id)->first();
        return json_encode(['data' => $user], JSON_UNESCAPED_UNICODE);
    }

    public function updateUser(Validator $validator, $id)
    {
        parse_str(file_get_contents('php://input'), $payload);
        $name = $payload['name'] ?? '';
        $email = $payload['email'] ?? '';

        $validator->make(
            ['name' => $name, 'email' => $email],
            ['name' => 'required|string|max:100', 'email' => 'required|email|max:150']
        );

        if ($validator->fails()) {
            http_response_code(422);
            return json_encode(['error' => $validator->first()], JSON_UNESCAPED_UNICODE);
        }

        DB::table('users')->where('id', $id)->update([
            'name' => $name,
            'email' => $email,
        ])->execute();

        return json_encode(['message' => 'updated', 'id' => $id], JSON_UNESCAPED_UNICODE);
    }

    public function deleteUser($id)
    {
        $this->users->where('id', $id)->delete()->execute();
        return json_encode(['message' => 'deleted', 'id' => $id], JSON_UNESCAPED_UNICODE);
    }
}

5) Route CRUD app/Router/web/user_basic_crud.php

<?php

use App\Controller\UserController;
use DLight\Application\Router;

Router::group('/user')::action(function (Router $router) {
    $router->sign('GET /list', [UserController::class, 'listUsers'])->name('user.list');
    $router->sign('POST /store', [UserController::class, 'storeUser'])->name('user.store');
    $router->sign('GET /show/{id}', [UserController::class, 'showUser'])->name('user.show');
    $router->sign('PUT /edit/{id}', [UserController::class, 'updateUser'])->name('user.update');
    $router->sign('DELETE /delete/{id}', [UserController::class, 'deleteUser'])->name('user.delete');
});

File này đã được load trong public/index.php bằng:

->setUpWebRoutes(ROOT_DIR . 'app/Router/web/user_basic_crud.php')

6) Test nhanh

Chạy app:

php dli -s

Test endpoint:

7) Note ngắn