Người trợ giúp trong Magento là gì?


22

Người trợ giúp trong Magento là gì?

Trong trường hợp nào người ta nên sử dụng và không sử dụng người trợ giúp?

Câu trả lời:


28

Về mặt lý thuyết bạn không bao giờ nên sử dụng người trợ giúp.
Người trợ giúp chỉ là tập hợp của các phương thức không liên quan và luôn được khởi tạo dưới dạng một singletons.
Về cơ bản, đây là lập trình thủ tục với các hàm được nhóm dưới một số không gian tên (tên lớp trong trường hợp này). Nhưng vì Magento có người trợ giúp trong lõi, bạn có thể đặt phương thức của mình vào đó mà bạn không biết nên đặt chúng ở đâu hoặc nếu bạn cần gọi chúng ở nhiều nơi khác nhau (mô hình, bộ điều khiển, mẫu)

Sử dụng chúng như là một phương sách cuối cùng.

Ngoài ra Magento yêu cầu một người trợ giúp cho mỗi mô-đun vì lý do dịch thuật.
Bạn chỉ có thể tạo một trình trợ giúp được gọi Data.phptrong mỗi mô-đun và để trống.


"Sử dụng" thực sự duy nhất tôi đã tìm thấy cho người trợ giúp là họ được đảm bảo luôn là người độc thân. Tôi đã làm việc với một số mã kế thừa giáo dục đang tải các bộ sưu tập trong foreachcác vòng lặp và tất cả các loại điên rồ. Tôi thấy việc tái hiện logic đáng sợ này với một người trợ giúp và sử dụng nó như một bộ đệm đối tượng là hữu ích và không có nhiều lỗi từ các nhà phát triển trong tương lai, những người có thể vô tình gọi getModelthay vì getSingletonnếu tôi đặt nó trong một mô hình.
Luke Rodgers

@LukeRodgers. Tôi thấy quan điểm của bạn nhưng tôi không nghĩ rằng "có thể đã vô tình gọi getModel thay vì getSingleton" đủ điều kiện là lý do thực sự để sử dụng người trợ giúp. Tôi có thể lập luận rằng bạn có thể "vô tình" gọi "xóa" thay vì "lưu". Những gì bảo vệ bạn có thể làm để tránh điều này? Tôi đoán "chú ý" là một phần của phát triển phần mềm.
Marius

Đã đồng ý. Trong những kịch bản này, tôi đoán tôi chỉ đang cố gắng viết mã phòng thủ chống lại loài người.
Luke Rodgers

Làm thế nào bạn sẽ đi về việc thêm các phương thức tùy chỉnh vào người trợ giúp cốt lõi?
tecjam

13

Câu hỏi có hai khía cạnh:

  1. Tôi có nên viết người trợ giúp của riêng tôi và để làm gì?
  2. Tôi có nên sử dụng các trợ giúp cốt lõi và để làm gì?

1. Người trợ giúp viết

Nói chung, sau khi lớp học được đặt tên Helper, Utilhoặc tương tự chỉ nói "Tôi có một số chức năng mà tôi không biết được nơi để đặt" và không có ý nghĩa nhiều như là một lớp.

Magento khởi tạo những người trợ giúp như những người độc thân và hầu hết những người trợ giúp cốt lõi không có bất kỳ trạng thái nào, vì vậy các phương thức cũng có thể statichoặc thậm chí functionskhông có lớp. Tất cả điều này thường được coi là một mùi mã , một lỗ hổng trong thiết kế ứng dụng.

Như Marius đã chỉ ra, bạn không cần phải sử dụng các trình trợ giúp cho mã của riêng bạn. Chỉ cần tạo một trình trợ giúp trống mặc định cho mỗi mô-đun nếu bạn sử dụng các bản dịch cụ thể của mô-đun, nếu không chúng sẽ không hoạt động. Thích các mô hình (không cần mở rộng Mage_Core_Model_Abstractnếu chúng không biểu thị dữ liệu cơ sở dữ liệu) hoặc các lớp thư viện độc lập.

Tuy nhiên, tôi sẽ không quá khắt khe về việc "hoàn toàn không sử dụng người trợ giúp" và thay vào đó sử dụng chúng cho các phím tắt truy vấn như:

  • cấu hình mô-đun truy cập:

    public function getFooBar() 
    {
        return Mage::getStoreConfig('module/foo/bar');
    }
  • phương pháp nhà máy cho các lớp thư viện

    public function getNewFooService()
    {
        return new \Foo\Service(...);
    }

Bạn có thể tìm thấy những nơi khác nhưng IMHO, trình trợ giúp mô-đun thường đủ tốt cho những thứ như vậy.


2. Sử dụng người trợ giúp

Tiêu thụ những người trợ giúp cốt lõi là điều bạn sẽ làm khá thường xuyên.

Ví dụ:

  • __()phương pháp dịch thuật: Để có được bản dịch của một mô-đun cụ thể, bạn nên sử dụng Mage::helper('module-alias')->__('string to be translated'). Điều này xảy ra ngầm nếu bạn sử dụng $this->__(...)trong một mẫu hoặc khối và nếu bạn sử dụng translate="..."thuộc tính trong các tệp XML
  • Mage::helper('core') phương pháp: ngày địa phương hóa, giá cả và hình thành tiền tệ, thoát và mã hóa dữ liệu
  • Mage::helper('tax') phương pháp để lấy thông tin từ cấu hình thuế và tính giá dựa trên đó
  • Mage::helper('catalog/image') cung cấp giao diện để tạo hình ảnh danh mục được lưu trữ và thay đổi kích thước và truy xuất URL của chúng
  • Mage::helper('catalog/product_url_rewrite')->joinTableToSelect() nối bảng viết lại URL với truy vấn bộ sưu tập sản phẩm.

Có nhiều chức năng hữu ích hơn (ít nhiều) ẩn trong bộ trợ giúp lõi, nếu bạn cần một chức năng cụ thể có khả năng được sử dụng trong lõi ở đâu đó, hãy kiểm tra xem bạn có thể sử dụng lại phương thức trợ giúp hay không.

Thông thường những người trợ giúp này là các đối tượng không trạng thái và các phương thức là các phương thức truy vấn (nghĩa là chúng không có tác dụng phụ)

Nhưng như mọi khi Magento phá vỡ các quy tắc bất thành văn của riêng mình và không nên lấy làm ví dụ. Một ví dụ "tốt" về cách không sử dụng các trình trợ giúp là Mage_Catalog_Helper_Product_Comparemột thuộc $_itemCollectiontính chỉ có thể được khởi tạo một lần và một thuộc $_customerIdtính có thể được thay đổi bằng một setter. Bạn sẽ tìm thấy một vài người trợ giúp liên quan đến danh mục với các bộ sưu tập đính kèm. Viết các bài kiểm tra cho mã sử dụng chúng hoặc sử dụng lại chúng trong các ngữ cảnh khác nhau không thú vị, vì vậy vui lòng không làm điều đó ở nhà.

Người catalog/imagetrợ giúp được đề cập ở trên là một ví dụ khác về người trợ giúp thực sự không nên là người trợ giúp. Trước tiên, bạn cần phải vượt qua một sản phẩm init()để đặt lại trạng thái hiện tại của nó, sau đó bạn đặt các tham số khác nhau (như resize(), setQuality()) và cuối cùng, bạn có thể nhận URL bằng __toString()phương thức của nó . Điều đó có vẻ tốt khi được sử dụng trong một mẫu nhưng mã là một mớ hỗn độn lớn và nó không có ý nghĩa như một singleton.


TL; DR:

  • Các trợ giúp cốt lõi chứa các công cụ hữu ích.
  • Bạn cần người giúp đỡ để dịch
  • Người giúp việc nên không quốc tịch
  • Trong các mô-đun của riêng bạn, tránh sử dụng các trình trợ giúp như các bộ sưu tập hàm. Trong hầu hết các trường hợp, bạn có thể tìm thấy một nơi thích hợp hơn

Tôi thường sử dụng các trợ giúp trong tích hợp ERP đơn giản dựa trên các tệp phẳng. Tất cả những gì họ làm là viết và đọc các tệp từ các thư mục cục bộ và cập nhật các đối tượng khác (sản phẩm, đơn hàng, v.v.). Họ không có trạng thái hoặc bảng tương ứng của riêng họ trong các trường hợp được đề cập. Bạn nghĩ gì về điều này?
nhạcliftsme 21/07/2015

1
Điều đó vi phạm "không có tác dụng phụ". Đưa tôi thường vào đọc và ghi các file đang ReaderWritermô hình, mà thực sự làm có nhà nước (ít nhất là một nguồn tài nguyên tập tin). Ví dụ: để đọc dữ liệu trạng thái đơn hàng từ tệp CSV, tôi sẽ có sth. likea một OrderStatusCsvReadermô hình được sử dụng bởi một OrderStatusUpdatermô hình. Bằng cách này, tôi cũng phân tách các mối quan tâm "đọc dữ liệu từ tệp" và "thứ tự cập nhật trong Magento"
Fabian Schmengler 21/07/2015

4

Marius đã đúng. Tôi nghĩ người giúp đỡ là vô nghĩa.

Nhưng trong lý thuyết magento, bạn nên đặt mọi thứ vào người trợ giúp mà không thay đổi trạng thái của một đối tượng, ví dụ: có được định dạng giá.

Nhưng tất cả mọi thứ bạn có thể đưa vào một người trợ giúp, bạn cũng có thể đưa vào một mô hình. Và bạn có thể nhận được các phiên bản khác nhau của một mô hình, rất hữu ích cho việc thử nghiệm.


2

Tôi còn khá mới với Magento, nhưng với tôi có vẻ như Người trợ giúp tương đương với dịch vụ của Magento : "một bộ các chức năng phần mềm liên quan có thể được sử dụng lại cho các mục đích khác nhau". Một mô-đun xuất khẩu chức năng được cung cấp của nó thông qua các dịch vụ. Sử dụng một trình trợ giúp cho các chức năng mà bạn mời các mô-đun khác sử dụng.

Một mô hình chỉ nên cung cấp các phương thức liên quan trực tiếp đến việc lấy hoặc thiết lập trạng thái của đối tượng hoặc được liên kết với đối tượng được khởi tạo của mô hình.


1

Trợ giúp rất hữu ích để ngăn chặn mã trùng lặp (trong các mô hình, mẫu, ...) và đôi khi chúng chỉ cần thiết.

  • để kiểm tra xem mô-đun tùy chỉnh của bạn có được bật hay không, bạn có thể đặt một cái gì đó giống như Mage::getStoreConfigFlag('my/module/enabled')mọi tệp mà bạn muốn kiểm tra hoặc bạn sử dụng Mage::helper('my_module')->isEnabled()với lợi ích:
    • nếu tức là đường dẫn cấu hình thay đổi vì một số lý do, bạn chỉ cần điều chỉnh một tệp
    • bạn có thể viết lại isEnabled()phương thức trợ giúp và nó sẽ ảnh hưởng đến tất cả các lớp sử dụng nó, thay vì viết lại một số tệp
  • 13th @ Làm thế nào để viết một phần mở rộng tùy chỉnh? : Không viết lại các lớp trừ khi cần thiết. Sử dụng các trình quan sát và nếu không thể sử dụng các phương thức của trình trợ giúp nhận làm tham số và thể hiện của một lớp mà bạn muốn ghi đè. Sai: Ghi đè Mage_Catalog_Model_Productđể thêm phương thức getProductArticles(). Phải rồi . Trong trợ giúp của bạn thêmgetProductArticles(Mage_Catalog_Model_Product $product)
  • làm cho cập nhật bố trí linh hoạt hơn bằng cách sử dụng <action method="someMethod"><var helper="module/method" /></action>

Bạn chỉ có thể tạo một trình trợ giúp được gọi Data.phptrong mỗi mô-đun và để trống .

Khi sử dụng PHPUnit, bạn nên thêm một dòng duy nhất :protected $_moduleName = 'My_Module';

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.