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 Manager
và Business 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.
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.
$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:
$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ụ:
$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ụ:
$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ụ:
$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:
$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:
$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!