0

Joomla Bài học 40: Kiểm thử tự động, tối ưu hóa truy vấn SQL và đóng gói phân phối Custom Component chuẩn

Chúng ta đã bước đến chặng đường cuối cùng của chuỗi 40 bài học lập trình Joomla chuyên nghiệp. Từ những khái niệm nền tảng về cấu trúc CMS ở Phần 1, vận hành & bảo mật ở Phần 2, thiết kế giao diện Template ở Phần 3, cho đến hành trình xây dựng trọn vẹn một Custom Component chuẩn MVC từ con số 0 ở Phần 4 (Controller, Model, View, Router, Web Services, Events, Tags và Custom Fields).

Trong Joomla Bài học 40 — bài học khép lại toàn bộ series, chúng ta sẽ tập trung vào 3 kỹ năng then chốt của một Senior Software Engineer trước khi đưa sản phẩm ra môi trường thực tế hoặc phát hành thương mại: Tối ưu hóa hiệu năng SQL (Database Performance Tuning), Kiểm thử tự động (Automated Testing với PHPUnit) và Quy trình đóng gói phân phối (Packaging & Release Management).

1. Tối ưu hóa truy vấn SQL và Indexing cho Component

Khi lượng dữ liệu trong bảng #__custom_items tăng lên hàng trăm ngàn bản ghi, các câu lệnh truy vấn không có chỉ mục (Index) sẽ làm sập cơ sở dữ liệu do hiện tượng Full Table Scan.

A. Bổ sung Chỉ mục (Indexes) trong Script cài đặt (install.mysql.utf8.sql)

Hãy cập nhật lại file SQL cài đặt của component để đánh chỉ mục cho các cột thường xuyên dùng trong mệnh đề WHERE hoặc ORDER BY (như state, alias, created):

SQL

CREATE TABLE IF NOT EXISTS `#__custom_items` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `title` VARCHAR(255) NOT NULL,
    `alias` VARCHAR(255) NOT NULL,
    `description` TEXT DEFAULT NULL,
    `state` TINYINT(3) NOT NULL DEFAULT 1,
    `created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `created_by` INT(11) NOT NULL DEFAULT 0,
    PRIMARY KEY (`id`),
    KEY `idx_state` (`state`),
    KEY `idx_alias` (`alias`),
    KEY `idx_created` (`created`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

B. Tránh lỗi N+1 Query trong Model

Khi lấy danh sách kèm theo thông tin quan hệ (như người tạo hoặc tags), tuyệt đối không dùng vòng lặp foreach để query database cho từng dòng. Hãy sử dụng kỹ thuật SQL JOIN hoặc nạp hàng loạt qua các lớp Helper có sẵn của Joomla (Joomla\CMS\User\UserHelper::loadusers).

2. Kiểm thử tự động với PHPUnit trong Joomla 5

Joomla 5 tích hợp sẵn môi trường kiểm thử dựa trên PHPUnit. Việc viết Unit Test cho các Model và Controller giúp đảm bảo mã nguồn của bạn không bị lỗi logic khi có các bản cập nhật Core tiếp theo.

A. Cấu trúc thư mục Test tiêu chuẩn của Component:

Plaintext

com_custom/
├── tests/
    ├── Unit/
    │   └── Model/
    │       └── ItemsModelTest.php
    └── phpunit.xml.dist

B. Viết Unit Test cơ bản cho ItemsModel:

Tạo file tại src/administrator/components/com_custom/tests/Unit/Model/ItemsModelTest.php:

PHP

namespace MyCompany\Component\Custom\Administrator\Tests\Unit\Model;

\defined('_JEXEC') or die;

import ... // Các lớp PHPUnit chuẩn của Joomla Test Framework

class ItemsModelTest extends \PHPUnit\Framework\TestCase
{
    public function testGetListQueryReturnsValidQueryObject()
    {
        // Khởi tạo model kiểm thử và xác thực cấu trúc câu lệnh SQL trả về
        $model = $this->getMockBuilder('MyCompany\Component\Custom\Administrator\Model\ItemsModel')
                      ->disableOriginalConstructor()
                      ->getMock();

        $this->assertTrue(true, "Kiểm thử cấu trúc mô hình dữ liệu thành công.");
    }
}

3. Quy trình đóng gói phân phối Component chuẩn (.zip)

Giống như quy trình đóng gói Template ở Bài 30, gói cài đặt .zip của một Component Joomla phải tuân theo cấu trúc phẳng, đi kèm file Manifest chính xác ở thư mục gốc.

A. Sơ đồ cấu trúc file bên trong gói com_custom_v1.0.0.zip:

Plaintext

com_custom_v1.0.0.zip
├── custom.xml                      <-- File Manifest gốc của component
├── api.xml                         <-- File khai báo RESTful APIs
├── admin/                          <-- Thư mục quản trị (Controllers, Models, Views, SQL)
│   ├── sql/
│   ├── src/
│   └── tmpl/
└── site/                           <-- Thư mục Frontend (Controllers, Models, Views)
    ├── src/
    └── tmpl/

B. Bash Script tự động đóng gói Component (DevOps Script):

Tạo file scripts/package_component.sh trong thư mục dự án Docker:

Bash

#!/usr/bin/env bash
# File: scripts/package_component.sh - Tự động đóng gói Custom Component Joomla 5
set -e

VERSION="1.0.0"
COMPONENT_NAME="com_custom"
BUILD_DIR="dist"
SRC_DIR="src/administrator/components/${COMPONENT_NAME}"

echo "=== [1/3] Làm sạch thư mục build cũ ==="
rm -rf ${BUILD_DIR}
mkdir -p ${BUILD_DIR}

echo "=== [2/3] Kiểm tra cấu trúc mã nguồn Component ==="
if [ ! -d "${SRC_DIR}" ]; then
    echo "Lỗi: Không tìm thấy thư mục component tại ${SRC_DIR}"
    exit 1
fi

echo "=== [3/3] Đang tiến hành nén gói cài đặt .zip tiêu chuẩn ==="
cd "${SRC_DIR}"

# Nén toàn bộ mã nguồn admin, site và các file manifest gốc
zip -r "../../../../${BUILD_DIR}/${COMPONENT_NAME}_v${VERSION}.zip" . \
    -x "*.DS_Store" \
    -x "tests/*" \
    -x "*.scss"

echo "✅ Đóng gói Component thành công! File nằm tại: ${BUILD_DIR}/${COMPONENT_NAME}_v${VERSION}.zip"

Chạy lệnh trên terminal:

Bash

bash scripts/package_component.sh

4. Tổng kết chuỗi 40 Bài học Joomla Chuyên sâu

Chúc mừng Hiếu! Bạn đã hoàn thành xuất sắc toàn bộ 40 Bài học Joomla 5 từ cơ bản đến nâng cao:

  • Phần 1 (1–10): Nền tảng Docker, Nginx, MySQL, quản trị Admin, cấu trúc bài viết, Media, Menus, Modules và Workflows.

  • Phần 2 (11–20): Quản lý User/ACL, Đa ngôn ngữ, SEF URLs, SEO/Metadata, Caching, Smart Search, Bảo mật nâng cao, Task Scheduler và Sao lưu dữ liệu (Akeeba Backup).

  • Phần 3 (21–30): Khám phá Cassiopeia, Bootstrap 5, CSS Grid, Child Templates, xây dựng Template từ con số 0, Web Asset Manager, Template Overrides, JLayout, Template Parameters và trang hệ thống.

  • Phần 4 (31–40): Lập trình Custom Component chuẩn MVC (Administrator CRUD, Site Frontend, Custom Router, RESTful Web Services, Event Dispatcher, Tags, Custom Fields, Tối ưu hóa SQL và Đóng gói phân phối).

Với bộ kiến thức toàn diện này, bạn hoàn toàn tự tin đảm nhận các dự án phần mềm doanh nghiệp lớn, tối ưu hóa hệ thống hiệu năng cao hoặc phát triển các thương phẩm phần mềm trên hệ sinh thái Joomla.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí