[Magento 2] Factories là gì? Cách thức hoạt động của Factory (Lập trình Magento cơ bản)

Nội dung

Bài viết trước mình đã giới thiệu về [Magento 2] Events và Observer là gì? Ứng dụng của Events và Observer (Lập trình Magento cơ bản).

Trong bài viết này mình sẽ giới thiệu về Factories là gì? Cách thức hoạt động và cấu trúc của Factory trong lập trình Magento nhé!

Factories là gì?

Factories là một cơ chế được sử dụng để tạo ra các đối tượng (objects) thông qua các lớp (classes). Các đối tượng này có thể là các đối tượng tiêu chuẩn của Magento như Product, Category, Order, hay các đối tượng được tạo ra bởi các module riêng của bạn.

Factory được xem là lớp Models hiển thị một Database Entity (Thực thể trong cơ sở dữ liệu), tức là dữ liệu đại diện cho thực thể đó chẳng hạn ID, name, price,… Chúng tạo một lớp trừu tượng giữa Object ManagerBusiness Code.

Factories được sử dụng để tạo ra các đối tượng mà không cần trực tiếp gọi đến hàm khởi tạo của chúng. Thay vào đó, các đối tượng này được tạo ra thông qua một đối tượng Factory. Factory là một lớp trung gian có nhiệm vụ xử lý quá trình tạo đối tượng.

Factories là gì? Cách thức hoạt động của Factory
Factories là gì? Cách thức hoạt động của Factory

Thành phần của Factory

Một Factory được định nghĩa bởi hai thành phần chính: một interface (giao diện) và một class cụ thể (implementation). Interface này chứa một phương thức create() được sử dụng để tạo ra đối tượng, và class implementation được sử dụng để triển khai phương thức này.

Khi cần tạo đối tượng, Magento sẽ sử dụng Factory để tạo ra đối tượng mà không cần phải sử dụng trực tiếp ObjectManager. Điều này giúp giảm thiểu sự phụ thuộc vào ObjectManager và tăng khả năng bảo trì của mã nguồn.

PHP
$productFactory = $objectManager->create('Magento\Catalog\Model\ProductFactory');
$product = $productFactory->create();

Ở đây, $objectManager là một instance của lớp ObjectManager, và chúng ta sử dụng nó để tạo ra một instance của ProductFactory. Sau đó, ta sử dụng phương thức create() của ProductFactory để tạo ra một đối tượng của lớp Product.

Ngoài việc tạo đối tượng một cách dễ dàng, Factory còn cho phép chúng ta truyền các tham số vào phương thức khởi tạo của đối tượng. Ví dụ, để tạo một đối tượng Product với một số thuộc tính cụ thể, ta có thể sử dụng các tham số như sau:

PHP
$productFactory = $objectManager->create('Magento\Catalog\Model\ProductFactory');
$product = $productFactory->create([
    'name' => 'Test Product',
    'sku' => 'TEST123',
    'price' => 10.99,
]);

Việc sử dụng Factory cũng giúp tách biệt việc tạo đối tượng và xử lý logic của đối tượng, giúp mã nguồn trở nên rõ ràng và dễ đọc hơn.

Vai trò của Factories là gì?

Factories trong Magento 2 có vai trò quan trọng trong quá trình phát triển và bảo trì các ứng dụng Magento.

1. Tạo ra các đối tượng

Các factories được sử dụng để tạo ra các đối tượng trong Magento 2 một cách dễ dàng và hiệu quả. Bằng cách sử dụng factories, bạn có thể tạo ra các đối tượng chỉ bằng một vài dòng mã.

2. Cải thiện hiệu suất

Factories cũng giúp cải thiện hiệu suất của ứng dụng Magento của bạn. Khi sử dụng factories để tạo ra các đối tượng, bạn không cần phải tạo ra nhiều thể hiện (instances) của đối tượng. Thay vào đó, bạn có thể sử dụng một đối tượng Factory để tạo ra nhiều đối tượng.

3. Quản lý và kiểm soát đối tượng

Factories cũng giúp bạn quản lý và kiểm soát các đối tượng của bạn. Bằng cách sử dụng factories, bạn có thể quản lý việc tạo ra các đối tượng, đảm bảo rằng chúng được tạo ra đúng cách và được quản lý một cách hiệu quả.

Cách Factories hoạt động

Khi tạo ra một đối tượng thông qua Factory, bạn phải truyền vào tên của lớp (class) và các tham số cần thiết cho hàm khởi tạo của đối tượng đó. Sau đó, Factory sẽ sử dụng thông tin này để tạo ra một đối tượng mới và trả về cho bạn.

Các bước sử dụng Factories trong Magento 2:

1. Tạo Factory

Đầu tiên, bạn cần tạo một Factory cho lớp (class) mà bạn muốn tạo đối tượng. Bạn có thể tạo một Factory bằng cách sử dụng phương thức create của lớp ObjectManager. Ví dụ:

PHP
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$factory = $objectManager->create('Namespace\YourClassFactory');

2. Tạo đối tượng thông qua Factory

Sau khi bạn đã tạo Factory, bạn có thể sử dụng nó để tạo ra các đối tượng. Bạn có thể làm điều này bằng cách gọi phương thức create của Factory và truyền vào các tham số cần thiết cho hàm khởi tạo của đối tượng. Ví dụ:

PHP
$object = $factory->create(['param1' => 'value1', 'param2' => 'value2']);

3. Sử dụng đối tượng

Cuối cùng, bạn có thể sử dụng đối tượng được tạo ra thông qua Factory để thực hiện các tác vụ mong muốn. Ví dụ:

PHP
$object->doSomething();

Chuyện gì sẽ xảy ra khi không dùng Factories để tạo đối tượng

Trường hợp đối tượng không xử dụng Factory để khởi tạo thì khi khởi tạo đối tượng trong constructor thì cứ mỗi lần gọi tới lớp khởi tạo đối tượng, và những lớp này sẽ được lưu trữ trong bộ nhớ. Khi bạn lặp lại việc tạo đối tượng một cách liên tục, đặc biệt là trong một vòng lặp, hệ thống sẽ tiêu tốn rất nhiều bộ nhớ, làm cho hệ thống chậm và dễ bị treo.

Thay vào đó, khi sử dụng Factory, bạn có thể tạo nhiều đối tượng khác nhau chỉ với một Factory. Khi lặp lại việc tạo đối tượng sử dụng Factory, Factory sẽ tạo ra các đối tượng mới mà không cần tạo ra các lớp mới, giúp tiết kiệm bộ nhớ và tăng tốc độ xử lý.

Trường hợp 1: Sử dụng Factory

Ví dụ, giả sử bạn muốn lấy tất cả sản phẩm trong danh sách sản phẩm, nếu bạn sử dụng Factory, bạn có thể viết mã như sau:

PHP
$productCollectionFactory = \Magento\Framework\App\ObjectManager::getInstance()->get('\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory');
$productCollection = $productCollectionFactory->create();
$productCollection->load();
foreach ($productCollection as $product) {
    // Do something with the product
}

Trong ví dụ này, khi bạn gọi phương thức create() của CollectionFactory, nó sẽ tạo ra một đối tượng mới Product Collection. Bạn có thể sử dụng đối tượng này để lấy danh sách sản phẩm mà không cần tạo đối tượng Product Collection mới mỗi lần bạn muốn lấy danh sách sản phẩm. Điều này giúp tiết kiệm bộ nhớ và tăng tốc độ xử lý.

Trường hợp 2: Không sử dụng Factory

Khi không sử dụng CollectionFactory mà gọi trực tiếp đến đối tượng Collection trong Magento 2, bạn sẽ phải khởi tạo đối tượng Collection bằng cách gọi trực tiếp constructor của nó như sau:

PHP
$productCollection = new \Magento\Catalog\Model\ResourceModel\Product\Collection();
$productCollection->load();
foreach ($productCollection as $product) {
    // Do something with the product
}

Việc khởi tạo đối tượng Collection bằng cách gọi trực tiếp sẽ làm cho mã nguồn trở nên khó bảo trì và khó mở rộng. Điều này bởi vì, nếu có sự thay đổi trong các lớp cấu trúc hoặc các thay đổi khác liên quan đến Collection, chẳng hạn có một thay đổi nào trong Collection bạn sẽ phải sửa mã nguồn trong tất cả các nơi sử dụng trực tiếp Collection.

Khi sử dụng Factory, Magento sử dụng kỹ thuật Lazy Loading để khởi tạo đối tượng khi đối tượng khi cần thiết. Điều này giúp tiết kiệm tài nguyên và tăng hiệu suất của hệ thống. Tuy nhiên, nếu bạn sử dụng trực tiếp, đối tượng Collection sẽ được tạo ra ngay khi chương trình được khởi động và sẽ tiêu tốn tài nguyên của hệ thống ngay từ đầu.

Ví dụ thực thế nhất về việc không sử dụng Factory:

Mình tạo lớp Collection Product và lặp 10 sản phẩm và không sử dụng Factory để khởi tạo đối tượng và kết quả mình nhận về đó là mình nhận 10 sản phẩm nhưng chỉ duy nhất sản phẩm cuối cùng.

Giải thích:

Khi chúng ta khởi tạo đối tượng Collection Product thì khi lặp xuất ra 10 sản phẩm thì trong quá trình đó đối tượng sẽ được tạo ra và lưu vào bộ nhớ trong quá trình khởi động ứng dụng. Khi danh sách các sản phẩm sử dụng cùng một đối tượng Product để lấy thông tin, thì các giá trị thuộc tính của sản phẩm sẽ được ghi đè lên đối tượng Product duy nhất đó. Và kết quả là lặp 10 lần thì ta sẽ trả ra 10 sản phẩm cùng nhau và lấy vị trí sản phẩm cuối cùng.

Kết bài

Factories là một thành phần quan trọng trong lập trình Magento 2, giúp tạo ra các đối tượng một cách dễ dàng và hiệu quả. Bằng cách sử dụng factories, bạn có thể cải thiện hiệu suất của ứng dụng Magento của mình và quản lý các đối tượng một cách hiệu quả. Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về khái niệm factories và cách chúng hoạt động trong Magento 2.

Ngoài ra các bạn tham khảo bài viết này để hiểu rõ hơn về Factory nhé: https://developer.adobe.com/commerce/php/development/components/factories/

Mọi thắc mắc vui lòng comment vào bài viết mình sẽ giải đáp cho các bạn. Cảm ơn các bạn đã dành thời gian tìm hiểu bài viết này! Thân ái!

Bài viết liên quan

SQL trong Data Analysis: Procedure và Function – 2 công cụ không thể thiếu

Xin chào các bạn đã quay trở lại chuỗi bài SQL trong Data Analysis...

Tự học Data Analyst: Tổng hợp chuỗi bài SQL 101 trong Data Analysis

Trong bài viết này, chúng ta sẽ tổng hợp các bài viết thành một...

SQL trong Data Analysis: Hiểu rõ và ứng dụng đệ quy (Recursive trong PostgreSQL)

Trong thế giới của cơ sở dữ liệu quan hệ, các truy vấn đệ...

[Phân Tích Dữ Liệu Với Python] Tập 1: Làm Quen Với Pandas

Trong thời đại tiến bộ của khoa học dữ liệu, khả năng phân tích...
spot_img