Tổng quan về ObjectManager và DI trong Magento 2

Magento 2 là một nền tảng thương mại điện tử mạnh mẽ, được viết bằng PHP và sử dụng kiến trúc hướng đối tượng (OOP) để phát triển các chức năng. Trong Magento 2, ObjectManager và Dependency Injection (DI) là những khái niệm rất quan trọng và được sử dụng rộng rãi trong việc phát triển các module và extension. Ở bài viết này, chúng ta sẽ tìm hiểu tổng quan và cách sử dụng ObjectManager và DI trong Magento 2.

ObjectManager Magento 2

ObjectManager là một thành phần quan trọng và cơ bản trong kiến trúc của Magento 2. Nó được sử dụng để tạo ra các đối tượng (object) mới và quản lý các đối tượng đó.

ObjectManager có thể gọi cho một đối tượng bất kỳ nếu nó được khai báo trước đó. Nó có thể tạo ra một đối tượng mới cho một lớp, lấy thông tin và tương tác thông qua các phương thức truy cập.

ObjectManager được khởi tạo trong Magento 2 thông qua file `app/bootstrap.php`. Và trong hầu hết các trường hợp, bạn không cần phải khởi tạo ObjectManager bằng tay mà Magento 2 sẽ tự động thực hiện điều này.

Một số phương thức thường được sử dụng trong ObjectManager Magento 2

1. create()

Phương thức `create()` được sử dụng để khởi tạo một đối tượng mới từ một lớp nhất định. Nó giống như `new` trong PHP, tuy nhiên nó có nhiều ưu điểm hơn, bởi vì nó hỗ trợ việc tạo ra đối tượng với các tham số.

Ví dụ:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$myObject = $objectManager->create('Namespace\Module\Model\MyObject');

2. get()

Phương thức `get()` được sử dụng để lấy một đối tượng đã được tạo trước đó từ ObjectManager. Thường được sử dụng để lấy các đối tượng được đăng ký trong hệ thống.

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$myObject = $objectManager->get('Namespace\Module\Model\MyObject');

3. configure()

Phương thức `configure()` được sử dụng để cấu hình một đối tượng sau khi nó đã được tạo ra. Điều này rất hữu ích nếu bạn muốn định cấu hình cho một đối tượng mà không muốn tạo ra một đối tượng mới.

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$myObject = $objectManager->create('Namespace\Module\Model\MyObject');
$objectManager->configure($myObject)->setData('key', 'value');

Ngoài ra còn có các phương thức khác:

  • `has($type)`: Kiểm tra xem ObjectManager đã tạo được đối tượng của loại `$type` chưa.
  • `createBatchProxy($types, $callback)`: Tạo một proxy để tạo và lấy các đối tượng của các loại trong `$types`. Hàm `$callback` sẽ được gọi mỗi khi proxy muốn truy cập đến một loại đối tượng nào đó.
  • `configureSharedInstance($instance, $type)`: Cấu hình một đối tượng `$instance` để được sử dụng như một đối tượng chia sẻ của loại `$type`.
  • `share($type)`: Chia sẻ một đối tượng với ObjectManager, để đối tượng đó có thể được sử dụng trong nhiều khối mã khác nhau.

Tuy nhiên, cách sử dụng ObjectManager trực tiếp như trên không được khuyến khích vì nó có thể gây ra một số vấn đề trong quá trình phát triển và bảo trì. Vì vậy, Magento 2 cung cấp cho chúng ta một giải pháp tốt hơn, đó là sử dụng Dependency Injection (DI).

Dependency Injection (DI) trong Magento 2

Dependency Injection (DI) là một mẫu thiết kế phổ biến trong lập trình phần mềm, nó giúp cho việc phát triển và bảo trì các ứng dụng dễ dàng hơn. Với DI, chúng ta không cần phải sử dụng trực tiếp ObjectManager để tạo ra các đối tượng mà hệ thống sẽ tự động cung cấp chúng cho chúng ta thông qua hệ thống DI của Magento 2.

Đây là một cách tiếp cận để giảm sự phụ thuộc giữa các lớp và quản lý các đối tượng. Trong Magento 2, DI giúp quản lý các đối tượng và nó là phần cốt lõi của kiến trúc của Magento.

Khi sử dụng DI, các đối tượng được chuyển đến constructor của một đối tượng như là các tham số. Điều này đảm bảo rằng các đối tượng đó được tạo ra trước khi đối tượng mới được tạo ra và thông qua constructor để giảm sự phụ thuộc. Ví dụ:

class MyObject
{
    protected $helper;
    
    public function __construct(
        \Namespace\Module\Helper\Data $helper
    ) {
        $this->helper = $helper;
    }
}

Trong ví dụ trên, `Namespace\Module\Helper\Data` được chuyển vào qua constructor của `MyObject`.

Kết luận

Tóm lại, trong Magento 2, ObjectManager và DI là hai khái niệm quan trọng và được sử dụng rộng rãi trong việc phát triển các module và extension. Mặc dù ObjectManager là một thành phần quan trọng trong kiến trúc của Magento 2, đã được tự động khởi tạo và sử dụng trong hầu hết các trường hợp, nhưng sử dụng DI là một giải pháp tốt hơn và được khuyến khích. Với DI, chúng ta không cần phải sử dụng trực tiếp ObjectManager để tạo ra các đối tượng mà hệ thống sẽ tự động cung cấp chúng cho chúng ta. Mong rằng bài viết này sẽ giúp ích cho bạn trong quá trình phát triển các module và extension trên Magento 2.

5 2 votes
Article Rating

Callula Huy

Callula is the Marketing Executive at Magetop. With more than 5 years of copywriting under his belt, Callula is into creating valuable content that is straight to the point. Life student. Workaholic. Foreign languages and traveling aficionado.

Leave a Reply or put your Question here

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x