Magento 2: sử dụng đúng người trợ giúp


9

Tôi bắt đầu thấy ngày càng nhiều người khai báo các lớp trợ giúp để có thể sử dụng các mục sau trong các tệp mẫu:

$this->helper('Path/To/Helper/Class')->customMethod();

Loại mã này cho phép mọi người tránh việc không sử dụng hạn chế trực tiếp trình quản lý đối tượng nhưng tôi có xu hướng thấy mã phải là mã chặn trong những người trợ giúp đó.

Vì vậy, đây là những câu hỏi của tôi:

  • những gì nên viết trong các lớp người trợ giúp?
  • trong trường hợp nào có liên quan để sử dụng các phương thức của trình trợ giúp trong các mẫu?

Câu trả lời:


19

Đừng.
Điều này giống như sử dụng ObjectManager::getInstance()->create()trong một mẫu!
Thay vào đó, sử dụng Khối tùy chỉnh nhận trình trợ giúp dưới dạng phụ thuộc của hàm tạo và thêm phương thức proxy gọi phương thức trình trợ giúp.

Trong mẫu:

$block->customMethod()

Trong khối:

public function __construct(Path/To/Helper/Class $helperClass, ...other dependencies...)
{
    $this->helper = $helperClass;
    // ...other assignments and call to parent::__construct()
}

public function customMethod()
{
    return $this->helper->customMethod();
}

Trong nguyên tắc OOP, điều này tránh vi phạm "Luật của Demeter". Nó đóng gói logic nghiệp vụ trong khối thay vì mẫu. Là một tác dụng phụ, nó cũng làm cho logic dễ kiểm tra hơn khi logic được chuyển vào khối.

Về logic nào được đưa vào các lớp của trình trợ giúp, tôi thấy rằng trong trình trợ giúp Magento 2 hầu như có ý nghĩa đối với các dịch vụ, giống như một mô hình không phải là mô hình, nhưng chứa mã có thể sử dụng lại, ví dụ như định dạng giá (có trong lõi, nhưng tôi có thể Tôi không nghĩ đến một ví dụ tốt hơn ngay bây giờ).


Tôi đồng ý với nguyên tắc này, tuy nhiên có vẻ như việc sử dụng ưu tiên di.xmlcho loại lớp khối, không giữ một số cấu hình bố cục. Tôi đã thử ví dụ để làm điều đó cho lớp \Magento\Catalog\Block\Product\View\Type\Simple, mẫu default.phtmlđược sử dụng trong mẫu của chúng tôi bị bỏ qua. Không biết tại sao vào lúc này
Sylvain Rayé

2
Nhảy vào đây để biết thêm thông tin cập nhật. Kể từ 2.2, việc mở rộng các lớp Block không được khuyến khích. Thay vào đó, nếu logic trình bày tùy chỉnh là bắt buộc, ViewModel phải được xác định và khai báo làm đối số cho Khối trong layout.xml. Vì ViewModels được xây dựng thông qua Trình quản lý đối tượng, bạn có thể kết nối biểu đồ phụ thuộc của riêng bạn mà không để lộ BC trước những thay đổi trong các phiên bản tương lai của Magento 2.
John Hall

1

Tôi thấy người trợ giúp là các chức năng toàn cầu bên trong mô-đun của bạn (xin lỗi vì từ 'toàn cầu') và các nhà quản lý / hợp đồng dịch vụ là các chức năng toàn cầu được phép sử dụng bên trong cũng như bên ngoài mô-đun của bạn.

Nếu bạn tuân theo nguyên tắc này, bạn sẽ thấy việc sử dụng tối thiểu cho người trợ giúp, tôi chỉ sử dụng chúng làm trình bao bọc cấu hình trong các mô-đun của mình.

$this->configHelper->get(Config::PATH_TO_XML_PATH);
$this->configHelper->isEnabled();

Loại công cụ này. Nếu bạn có bất kỳ chức năng nào khác có thể thực tế bên ngoài mô-đun của mình, thay vào đó hãy tạo một trình quản lý.

Trong một thế giới lý tưởng, các nhà phát triển bên thứ 3, những người cần chức năng của các mô-đun khác chỉ nên tìm trong các giao diện có sẵn cho các kho lưu trữ và trình quản lý và nội dung trong Api-folder.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.