×

Hướng dẫn viết class xử lý đơn hàng trong PHP

Trong bài viết này, chúng ta sẽ khám phá cách viết một lớp (class) xử lý đơn hàng trong PHP, từ các nguyên tắc cơ bản cho đến các phương pháp nâng cao nhằm phục vụ việc quản lý đơn hàng hiệu quả trong ứng dụng web của bạn. Lớp này sẽ giúp ta quản lý các thông tin đơn hàng, từ việc tạo đơn hàng đến cập nhật và xóa đơn hàng khi cần.

Trong quy trình phát triển ứng dụng thương mại điện tử, việc quản lý đơn hàng là một trong những yếu tố quan trọng. Từ việc xử lý thanh toán cho đến theo dõi trạng thái đơn hàng, một lớp xử lý đơn hàng sẽ giúp bạn tổ chức và quản lý dữ liệu hiệu quả hơn.

Định nghĩa lớp đơn hàng

Đầu tiên, chúng ta sẽ định nghĩa lớp Order, nơi sẽ chứa các thuộc tính và phương thức cơ bản để quản lý đơn hàng.

class Order {
    private $orderId;
    private $customerId;
    private $items = [];
    private $totalAmount;
    private $status;

    public function __construct($orderId, $customerId) {
        $this->orderId = $orderId;
        $this->customerId = $customerId;
        $this->status = 'Pending'; // Trạng thái mặc định
        $this->totalAmount = 0.0;
    }

    // Thêm sản phẩm vào đơn hàng
    public function addItem($item, $quantity, $price) {
        $this->items[] = [
            'item' => $item,
            'quantity' => $quantity,
            'price' => $price
        ];
        $this->totalAmount += $quantity * $price;
    }

    // Lấy danh sách items
    public function getItems() {
        return $this->items;
    }

    // Lấy tổng số tiền
    public function getTotalAmount() {
        return $this->totalAmount;
    }

    // Cập nhật trạng thái đơn hàng
    public function updateStatus($status) {
        $this->status = $status;
    }

    // Lấy thông tin đơn hàng
    public function getOrderDetails() {
        return [
            'orderId' => $this->orderId,
            'customerId' => $this->customerId,
            'items' => $this->getItems(),
            'totalAmount' => $this->getTotalAmount(),
            'status' => $this->status
        ];
    }
}

Tạo đơn hàng mới

Tiếp theo, chúng ta sẽ tạo một đối tượng từ lớp Order để quản lý đơn hàng.

$order = new Order(1, 101); // 1 là ID đơn hàng, 101 là ID khách hàng
$order->addItem('Product A', 2, 50); // Thêm 2 sản phẩm A, mỗi sản phẩm 50
$order->addItem('Product B', 1, 100); // Thêm 1 sản phẩm B, mỗi sản phẩm 100

Lấy thông tin đơn hàng

Để lấy thông tin chi tiết của đơn hàng, chúng ta sử dụng phương thức getOrderDetails.

$orderDetails = $order->getOrderDetails();
print_r($orderDetails);

Thêm xử lý lỗi

Khi viết lớp đơn hàng, không thể thiếu việc xử lý các trường hợp lỗi. Chúng ta có thể bổ sung các phương thức để kiểm tra tình trạng của các hành động như thêm sản phẩm hay cập nhật trạng thái.

public function addItem($item, $quantity, $price) {
    if ($quantity <= 0) {
        throw new Exception('Số lượng sản phẩm phải lớn hơn 0');
    }
    // Tiếp tục thêm sản phẩm
}

Kết nối cơ sở dữ liệu

Lớp Order đầu tiên là chỉ dùng để xử lý logic phía ứng dụng. Để quản lý đơn hàng trên cơ sở dữ liệu, chúng ta cần kết nối với CSDL và thực hiện các truy vấn cần thiết.

class OrderDatabase {
    private $db;

    public function __construct($dbConnection) {
        $this->db = $dbConnection;
    }

    public function saveOrder(Order $order) {
        // Giả sử $this->db là một PDO instance
        $stmt = $this->db->prepare("INSERT INTO orders (orderId, customerId, totalAmount, status) VALUES (?, ?, ?, ?)");
        $stmt->execute([
            $order->getOrderDetails()['orderId'],
            $order->getOrderDetails()['customerId'],
            $order->getTotalAmount(),
            $order->getOrderDetails()['status']
        ]);
        // Lưu các items liên quan sau đó
    }
}

Cập nhật đơn hàng trong CSDL

Một lần nữa, bạn sẽ cần thêm phương thức trong lớp OrderDatabase để cập nhật đơn hàng.

public function updateOrder(Order $order) {
    $stmt = $this->db->prepare("UPDATE orders SET totalAmount = ?, status = ? WHERE orderId = ?");
    $stmt->execute([
        $order->getTotalAmount(),
        $order->getOrderDetails()['status'],
        $order->getOrderDetails()['orderId']
    ]);
}

Xóa đơn hàng

Cuối cùng, nếu cần xóa đơn hàng, bạn sẽ thêm một phương thức xóa vào lớp xử lý đơn hàng.

public function deleteOrder($orderId) {
    $stmt = $this->db->prepare("DELETE FROM orders WHERE orderId = ?");
    $stmt->execute([$orderId]);
}

Kết luận

Với thiết kế này, bạn đã có một lớp Order hoàn chỉnh với các phương thức hỗ trợ cho việc quản lý và lưu trữ đơn hàng. Hãy đảm bảo kiểm tra và tối ưu mã nguồn để phục vụ nhu cầu của dự án cụ thể của bạn.

Bài viết trên chỉ là một phần nhỏ trong việc phát triển một ứng dụng thương mại điện tử hoàn chỉnh, và còn rất nhiều tính năng và chi tiết khác có thể được thêm vào để nâng cao hiệu quả và khả năng mở rộng của hệ thống. Bằng cách tổ chức mã nguồn một cách logic, bạn sẽ có được một ứng dụng có khả năng bảo trì và mở rộng trong tương lai.

Comments