Không còn setup_version trong module.xml, magento 2.3 quản lý cập nhật database kiểu gì?

Xin chào tất cả mọi người!

Như chúng ta đã biết, magento 2.3 đã chuyển sang dùng db_schema.xml để quản lý việc tạo database thay vì Setup/InstallSchemaUpgradeSchema.

Việc sử dụng db_schema.xml tạo điều kiện cho chúng ta tạo database dễ dàng hơn rất nhiều. Ví dụ như ngày trước, chúng ta khi cần thêm 1 cột vào database, ta phải nâng version, dùng câu lệnh addColumn.

Điều này khá phiền phức, ở db_schema.xml, ta chỉ cần thêm 1 trường vào file xml và chạy lệnh setup:upgrade là đủ. Magento sẽ tự thêm cột cho chúng ta mà ko cần phải code thêm file nào nữa.

Và điều này đã khiến magento đã remove setup_version trong module.xml. Từ magento 2.3, version của module chỉ được viết trong composer.json.

Vậy khi chúng ta cần thêm data, hoặc viết các câu lệnh php (xml thì không thể xử lý logic if else) thì làm thế nào để thay thế cho UpgradeSchema và UpgradeData? Khi ta không còn version trong setup_version nữa, ta không thể nào dùng version_compare để check điều kiện chạy lệnh được :smiley:

        if (version_compare($context->getVersion(), '0.1.0.20', '<')) {
            $this->customSaleHelper->createProduct($setup);
        }

Vậy magento dùng gì để quản lý sao cho:

  • Đã chạy upgrade 1 lần rồi thì lần sau không chạy lại đoạn lệnh đó nữa (ko còn check điều kiện compare version < được )

  • Thứ tự chạy thế nào , cái nào trước cái nào sau?

Và đây là cơ chế :smiley:

image

Mọi người sẽ thấy thư mục Patch ở Setup. Bên trong sẽ chứa các đoạn code php

image

Mỗi file ứng với 1 công việc. Thú tự chạy được quy định ở phần dependence:

Ví dụ để chạy file này, cần chạy file trong dependencies kia trước.

Và một điều nữa là, sau khi chạy rồi, làm thế nào để lần sau không chạy lại nữa ?
Đây là giải thích :
Khi 1 file patch được chạy, 1 record sẽ được lưu trong bảng patch_list:

Và tất nhiên, patch này đã được lưu vào trong bảng này rồi, lần chạy setup:upgrade tiếp theo magento sẽ check và không chạy lại nữa.

Lưu ý một điều là patch sẽ được chạy sau db_schema.xml.

Trên đây là 1 cơ chế rất hay của magento 2.3. Hy vọng bài viết sẽ giúp ích được cho mọi người :smiley:

4 Likes

Điều này vẫn được giữ trong Magento 2.4 em nhỉ?

Vâng chị :smiley:
Em viết bài này vì module của cty mình vẫn dùng công nghệ của 2.2, chỉ một số ít dùng 2.3 và còn nhiều hạn chế. Sau bài này thì hi vọng mọi người sẽ dùng nhiều hơn.