Khi gửi các sự kiện trong một mô-đun tùy chỉnh?


14

Đây là một câu hỏi liên quan đến cả Magento 1 và Magento 2.

Tôi hiểu rằng, như một thông lệ tốt, các nhà phát triển mô-đun bên thứ 3 được khuyến khích gửi các sự kiện trong mô-đun tùy chỉnh của họ để giúp làm việc với các mô-đun khác dễ dàng hơn.

Tôi muốn biết:

  • Nhà phát triển nên gửi các sự kiện trong một mô-đun tùy chỉnh ở đâu?
  • Có bất kỳ vị trí được đề nghị để gửi sự kiện? Vd: Bộ điều khiển, mô hình, khối, người trợ giúp, người quan sát?
  • làm thế nào gửi sự kiện ảnh hưởng đến hiệu suất?

Đúng! câu hỏi hay. bất cứ ai xin trả lời câu hỏi này Nó sẽ rất hữu ích cho các nhà phát triển tiện ích mở rộng của bên thứ ba cũng như cho các dự án tùy chỉnh.
mapaladiya

Câu trả lời:


10

Bạn sẽ không tìm thấy một câu trả lời hay, rõ ràng, mang tính quyết định ở đây. Nhìn chung, bạn nên gửi các sự kiện trong mô-đun của mình, nơi bạn và người dùng của bạn cần chúng - nếu bạn không thể nghĩ đến bất cứ nơi nào chúng có thể cần, bạn không cần phải gửi chúng. Chính Magento phát ra rất nhiều sự kiện ở rất nhiều nơi khác nhau (bộ điều khiển trước / bài gửi, bất kỳ hoạt động thô lỗ nào, v.v.) mà mô-đun của bạn sẽ gửi một số sự kiện hữu ích mà bạn không phải làm gì.

Vì điều đó không thỏa mãn, bạn muốn mô-đun của mình gửi một sự kiện khi có một số hành động mà mô-đun của bạn thực hiện mà người dùng của bạn có thể muốn thêm các mục vào, xóa các mục khỏi, thay đổi hoặc thực hiện một hành động riêng biệt độc lập với hành động ban đầu. Ví dụ: Magento có một visitor_initsự kiện không phải là một phần của bộ sự kiện được tạo tự động tiêu chuẩn. Sự kiện này cho phép các lập trình viên sửa đổi objet của khách truy cập trước khi Magento ghi dữ liệu. Đây không phải là cách mà các nhà phát triển mô-đun ban đầu biết một cách xác địnhđây là nơi cần thêm một sự kiện - nó có thể đến từ các yêu cầu tính năng và / hoặc các cuộc phỏng vấn với người dùng hệ thống. Biết người dùng của bạn muốn gì và nếu không thể / thực tế xây dựng UI / UX để cho phép họ làm điều đó thông qua quản trị viên, hãy thêm một móc sự kiện để một lập trình viên khác có thể làm điều đó cho họ.

Ít gợi cảm hơn, thêm các sự kiện cũng có thể là một cách rẻ tiền để cho phép các nhà phát triển (hoặc người dùng của bạn hoặc thậm chí nhóm của bạn ) thêm một số chức năng vào một đoạn mã hấp dẫn mà mọi người đều sợ chạm vào. Đặt dispatchEventcuộc gọi của bạn vào giữa mã, nối vào nó và bạn có thể thêm chức năng của mình mà không làm phiền mã trong phạm vi ban đầu. [Trình chỉnh sửa: Ngoài ra, bạn nên cấu trúc lại mã khủng khiếp đó vào một lúc nào đó]

Hiệu suất khôn ngoan, thêm một sự kiện để gửi sẽ phụ thuộc vào nơi bạn thêm nó. Khi bạn gọi dispatchsự kiện, Magento cần thực hiện thêm một số cuộc gọi PHP, truy vấn cấu hình cho bất kỳ trình quan sát được cấu hình nào, sau đó gọi cho người quan sát. Thực hiện một lần, đây là một bổ sung giá rẻ trong phạm vi của một công văn Magento tiêu chuẩn. Tuy nhiên, được thực hiện nhiều lần, (giả sử, trước mỗi khối kết xuất), điều này có thể cộng lại. Không có quy tắc tốt nào ở đây - vì luôn có câu trả lời đúng là hồ sơ.

Cuối cùng, với Magento 2, vẫn còn quá sớm để nói. Tất cả những điều trên vẫn được áp dụng - tuy nhiên hệ thống plugin thêm một vài nếp nhăn. Các plugin, theo một quan điểm, là một cách để tạo sự kiện như hành vi cho bất kỳ cuộc gọi phương thức công khai nào trong Magento. Về lý thuyết, nếu bạn thiết kế các lớp học của mình một cách chính xác, bạn sẽ không bao giờ cần một sự kiện. Tuy nhiên, trong thực tế, việc thả một sự kiện vào một chút mã phương thức được bảo vệ hoặc riêng tư sẽ là một giải pháp hấp dẫn cho các nhà phát triển Magento khi phương án thay thế là một quá trình tái cấu trúc dài. Ngoài ra, việc tạo một sự kiện được đặt tên cụ thể thường có thể tạo ra trải nghiệm thân thiện hơn cho các nhà phát triển sử dụng mô-đun của bạn.

Mong rằng sẽ giúp!


9

Đối với Magento 1, thời điểm tốt để ném các sự kiện là trước và sau tất cả các thao tác CRUD và trước và sau khi kết xuất. Nhiều trong số này đã được cung cấp bởi các lớp trừu tượng trong lõi, vì vậy trong thực tế không cần nhiều sự kiện của bên thứ ba.

Với Magento 2 thì tình hình lại khác. Vì các cuộc gọi phương thức công khai có thể bị chặn với các plugin, nên các sự kiện tùy chỉnh không còn cần thiết nữa.
Khi thiết kế các lớp, thay vì chỉ đơn giản là làm cho mọi phương thức trở nên công khai để có thể bị chặn, tốt hơn là phân tách một lớp lớn thành nhiều lớp nhỏ hơn.
Mỗi lớp nhỏ hơn sau đó có thể có một hoặc hai phương thức công khai được đặt tên riêng và có thể chặn được.


0

Giống như Vinai đã nói, trước / sau khi CRUD hoạt động. Một nơi quan trọng khác để gửi các sự kiện là trong các khối biểu mẫu adminhtml (nếu có). Bằng cách đó, bạn có thể thêm các trường đầu vào mới nếu bạn đã thêm các thuộc tính / trường tùy chỉnh mà không phải viết lại các khối biểu mẫu quản trị. (Đây là cho Magento 1). Xem ví dụ


0

Bên trong Magento 1, bạn có thể tận dụng các sự kiện thông qua các sự kiện tự động phát sinh. Tất cả bạn cần làm là đặt một $_eventPrefix$_eventObjectcác thuộc tính trên các mô hình của bạn. Ngoài ra, bạn có các sự kiện điều khiển bắn tùy chỉnh thông qua 'controller_action_predispatch_ ' . $this->getFullActionName()'controller_action_postdispatch_' . $this->getFullActionName()các sự kiện trên bộ điều khiển tự động. Những người có thể giúp bạn hầu hết các cách đó.

Đối với Magento 2, hãy để phương thức của bạn công khai bên trong các lớp học của bạn. Điều này cho phép các plugin chặn phương thức của bạn. Nếu bạn làm theo điều này, bạn sẽ không phải tạo bất kỳ sự kiện tùy chỉnh nào.

Tôi hi vọng cái này giúp được!

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.