ผู้ช่วยใน Magento คืออะไร
ในกรณีใดควรใช้และไม่ใช้ผู้ช่วยเหลือ?
ผู้ช่วยใน Magento คืออะไร
ในกรณีใดควรใช้และไม่ใช้ผู้ช่วยเหลือ?
คำตอบ:
ในทางทฤษฎีคุณไม่ควรใช้ผู้ช่วยเหลือ
ผู้ช่วยเหลือเป็นเพียงคอลเล็กชันของวิธีการที่ไม่เกี่ยวข้องและมีการสร้างอินสแตนซ์ให้เป็นซิงเกิลเสมอ
นี่คือการเขียนโปรแกรมตามขั้นตอนปกติกับฟังก์ชั่นที่จัดกลุ่มภายใต้เนมสเปซบางอย่าง (ชื่อคลาสในกรณีนี้) แต่เนื่องจากวีโอไอพีมีผู้ช่วยเหลืออยู่ในแกนกลางคุณจึงสามารถวางวิธีการของคุณไว้ในนั้นเพื่อให้คุณไม่มีความคิดว่าจะวางมันไว้ที่ไหนหรือถ้าคุณต้องการเรียกพวกมันในสถานที่ต่าง ๆ มากมาย (โมเดลตัวควบคุมแม่แบบ)
ใช้พวกเขาเป็นทางเลือกสุดท้าย
วีโอไอพียังต้องการผู้ช่วยสำหรับแต่ละโมดูลด้วยเหตุผลการแปล
คุณสามารถสร้างผู้ช่วยที่เรียกData.php
ในแต่ละโมดูลและปล่อยว่างไว้
คำถามมีสองด้าน:
โดยทั่วไปมีชั้นเรียนชื่อHelper
, Util
หรือคล้ายกันเพียงแค่พูดว่า "ผมมีฟังก์ชั่นบางอย่างที่ผมไม่ทราบว่าจะนำ" และไม่ได้ทำให้รู้สึกมากเป็นชั้น
Magento ยกตัวอย่างผู้ช่วยในฐานะซิงเกิลตันและผู้ช่วยแกนหลักส่วนใหญ่ไม่มีสถานะใด ๆ ดังนั้นวิธีการอาจเป็นได้static
หรือfunctions
ไม่ได้เรียน ทั้งหมดนี้มักจะถือว่าเป็นกลิ่นของรหัสซึ่งเป็นข้อบกพร่องในการออกแบบแอปพลิเคชัน
ดังที่ Marius ชี้ให้เห็นแล้วคุณไม่จำเป็นต้องใช้ตัวช่วยสำหรับรหัสของคุณเอง เพียงแค่สร้างผู้ช่วยว่างเปล่าเริ่มต้นต่อโมดูลหากคุณใช้การแปลเฉพาะโมดูลมิฉะนั้นพวกเขาจะไม่ทำงาน ต้องการโมเดล (ซึ่งไม่จำเป็นต้องขยายMage_Core_Model_Abstract
หากไม่แสดงข้อมูลฐานข้อมูล) หรือคลาสไลบรารีอิสระ
อย่างไรก็ตามฉันจะไม่เข้มงวดเกินไปเกี่ยวกับ "ไม่ได้ใช้ตัวช่วยเลย" และใช้พวกเขาแทนทางลัดแบบสอบถามเช่น:
การเข้าถึงการกำหนดค่าโมดูล:
public function getFooBar()
{
return Mage::getStoreConfig('module/foo/bar');
}
วิธีการโรงงานสำหรับคลาสไลบรารี
public function getNewFooService()
{
return new \Foo\Service(...);
}
คุณสามารถหาที่อื่นได้ แต่ IMHO ผู้ช่วยโมดูลมักจะดีพอสำหรับสิ่งต่าง ๆ เช่นนั้น
การบริโภคผู้ช่วยหลักคือสิ่งที่คุณจะทำค่อนข้างบ่อย
__()
วิธีการแปล: Mage::helper('module-alias')->__('string to be translated')
ในการได้รับการแปลของโมดูลที่เฉพาะเจาะจงที่คุณควรใช้ สิ่งนี้จะเกิดขึ้นโดยปริยายถ้าคุณใช้$this->__(...)
ภายในเทมเพลตหรือบล็อกและหากคุณใช้translate="..."
คุณลักษณะในไฟล์ XMLMage::helper('core')
วิธีการ: วันที่แปลราคาและสกุลเงินการจัดตั้งการหลบหนีและการเข้ารหัสข้อมูลMage::helper('tax')
วิธีการรับข้อมูลจากการกำหนดค่าภาษีและคำนวณราคาตามนั้นMage::helper('catalog/image')
จัดทำอินเทอร์เฟซเพื่อสร้างภาพแคตาล็อกแคชและปรับขนาดและดึง URL ของพวกเขาMage::helper('catalog/product_url_rewrite')->joinTableToSelect()
รวมตารางการเขียน URL ใหม่ไปยังแบบสอบถามการรวบรวมผลิตภัณฑ์มีฟังก์ชันที่มีประโยชน์มากมาย (มากหรือน้อย) ที่ซ่อนอยู่ในตัวช่วยหลักถ้าคุณต้องการฟังก์ชั่นเฉพาะที่น่าจะใช้ในแกนกลางบางแห่งให้ตรวจสอบว่าคุณสามารถใช้วิธีการช่วยเหลือซ้ำได้ไหม
ผู้ช่วยเหล่านี้มักเป็นวัตถุไร้สัญชาติและวิธีการเป็นวิธีการสืบค้น (เช่นพวกเขาไม่มีผลข้างเคียง)
แต่เช่นเคยวีโอไอพีได้ทำลายกฎที่ไม่ได้เขียนไว้และไม่ควรนำมาเป็นตัวอย่าง ตัวอย่าง "ดี" วิธีที่จะไม่ใช้ผู้ช่วยเหลือคือMage_Catalog_Helper_Product_Compare
สิ่งที่มี$_itemCollection
คุณสมบัติที่สามารถเริ่มต้นได้เพียงครั้งเดียวและ$_customerId
คุณสมบัติที่สามารถเปลี่ยนได้ด้วยตัวตั้งค่า คุณจะพบผู้ช่วยเหลืออีกสองสามคนที่เกี่ยวข้องกับแคตตาล็อกพร้อมคอลเลกชันที่แนบมา การเขียนแบบทดสอบสำหรับรหัสที่ใช้หรือนำกลับมาใช้ใหม่ในบริบทที่แตกต่างกันนั้นไม่สนุกดังนั้นโปรดอย่าทำอย่างนั้นที่บ้าน
catalog/image
ผู้ช่วยดังกล่าวข้างต้นเป็นตัวอย่างของผู้ช่วยที่ว่ามันไม่ควรจะเป็นผู้ช่วยอีก คุณต้องผ่านผลิตภัณฑ์init()
ก่อนซึ่งจะรีเซ็ตสถานะปัจจุบันของมันจากนั้นคุณตั้งค่าพารามิเตอร์ต่าง ๆ (เช่นresize()
, setQuality()
) และในที่สุดคุณจะได้รับ URL ด้วย__toString()
วิธีการ ที่ดูดีเมื่อใช้ในแม่แบบ แต่รหัสเป็นระเบียบมากและมันไม่สมเหตุสมผลเป็นซิงเกิล
TL; DR:
Reader
และWriter
รูปแบบที่จริงทำมีสถานะ (อย่างน้อยทรัพยากรไฟล์) ตัวอย่างเช่นสำหรับการอ่านข้อมูลสถานะการสั่งซื้อจากไฟล์ CSV ฉันจะมี sth lika OrderStatusCsvReader
โมเดลที่ใช้โดยOrderStatusUpdater
โมเดล ด้วยวิธีนี้ฉันยังแยกข้อกังวล "อ่านข้อมูลจากไฟล์" และ "อัปเดตคำสั่งใน Magento"
Marius ถูกต้อง ฉันคิดว่าผู้ช่วยไร้สาระ
แต่ในทฤษฎีวีโอไอพีคุณควรใส่ทุกอย่างไว้ในตัวช่วยซึ่งไม่เปลี่ยนสถานะของวัตถุเช่นรับราคาที่จัดรูปแบบ
แต่ทุกสิ่งที่คุณสามารถนำไปเป็นผู้ช่วยคุณสามารถสร้างแบบจำลองได้เช่นกัน และคุณสามารถรับอินสแตนซ์ต่าง ๆ ของแบบจำลองซึ่งมีประโยชน์สำหรับการทดสอบ
ฉันค่อนข้างใหม่สำหรับ Magento แต่สำหรับฉันมันดูเหมือนว่า Helper เปรียบได้กับบริการของ Magento : "ชุดของฟังก์ชันซอฟต์แวร์ที่เกี่ยวข้องที่สามารถนำกลับมาใช้ใหม่เพื่อวัตถุประสงค์ที่แตกต่างกัน" โมดูลส่งออกฟังก์ชันการทำงานที่เสนอผ่านบริการ ใช้ตัวช่วยสำหรับฟังก์ชั่นที่คุณเชิญโมดูลอื่นให้ใช้
แบบจำลองควรมีวิธีการที่เกี่ยวข้องโดยตรงกับการรับหรือการตั้งค่าสถานะของวัตถุหรือที่เชื่อมโยงกับวัตถุที่เป็นตัวอย่างของแบบจำลอง
ตัวช่วยมีประโยชน์ในการป้องกันโค้ดที่ซ้ำกัน (ในรุ่นเทมเพลต ... ) และบางครั้งก็จำเป็น
Mage::getStoreConfigFlag('my/module/enabled')
ไฟล์ทุกไฟล์ที่คุณต้องการตรวจสอบหรือใช้Mage::helper('my_module')->isEnabled()
ประโยชน์ด้วย:
isEnabled()
เมธอดตัวช่วยเหลือและจะมีผลกับคลาสทั้งหมดที่ใช้แทนการเขียนหลายไฟล์Mage_Catalog_Model_Product
ขวา ในผู้ช่วยของคุณเพิ่มgetProductArticles()
getProductArticles(Mage_Catalog_Model_Product $product)
<action method="someMethod"><var helper="module/method" /></action>
คุณสามารถสร้างผู้ช่วยที่เรียก
Data.php
ในแต่ละโมดูลและปล่อยว่างไว้
เมื่อใช้ PHPUnit คุณควรเพิ่มหนึ่งบรรทัด :protected $_moduleName = 'My_Module';
foreach
ลูปและความบ้าคลั่งทุกประเภท ฉันพบว่าการใช้ตรรกะที่น่ากลัวนี้ให้กับผู้ช่วยอีกครั้งและใช้มันเป็นวัตถุแคชเพื่อให้มีประโยชน์และออกจากห้องเล็ก ๆ เพื่อหาข้อผิดพลาดจากนักพัฒนาในอนาคตที่อาจโทรโดยไม่ตั้งใจgetModel
แทนgetSingleton
ถ้าฉันวางมันไว้ในแบบจำลอง