Câu trả lời:
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.php
trong mỗi mô-đun và để trống.
Câu hỏi có hai khía cạnh:
Nói chung, sau khi lớp học được đặt tên Helper
, Util
hoặ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ể static
hoặc thậm chí functions
khô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_Abstract
nế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.
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.
__()
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 XMLMage::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ệuMage::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úngMage::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_Compare
một thuộc $_itemCollection
tính chỉ có thể được khởi tạo một lần và một thuộc $_customerId
tí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/image
trợ 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:
Reader
và Writer
mô 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 OrderStatusCsvReader
mô hình được sử dụng bởi một OrderStatusUpdater
mô 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"
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.
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.
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.
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:
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ệpMage_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)
<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.php
trong 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';
foreach
cá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ọigetModel
thay vìgetSingleton
nếu tôi đặt nó trong một mô hình.