ผู้ช่วยใน Magento คืออะไร


คำตอบ:


27

ในทางทฤษฎีคุณไม่ควรใช้ผู้ช่วยเหลือ
ผู้ช่วยเหลือเป็นเพียงคอลเล็กชันของวิธีการที่ไม่เกี่ยวข้องและมีการสร้างอินสแตนซ์ให้เป็นซิงเกิลเสมอ
นี่คือการเขียนโปรแกรมตามขั้นตอนปกติกับฟังก์ชั่นที่จัดกลุ่มภายใต้เนมสเปซบางอย่าง (ชื่อคลาสในกรณีนี้) แต่เนื่องจากวีโอไอพีมีผู้ช่วยเหลืออยู่ในแกนกลางคุณจึงสามารถวางวิธีการของคุณไว้ในนั้นเพื่อให้คุณไม่มีความคิดว่าจะวางมันไว้ที่ไหนหรือถ้าคุณต้องการเรียกพวกมันในสถานที่ต่าง ๆ มากมาย (โมเดลตัวควบคุมแม่แบบ)

ใช้พวกเขาเป็นทางเลือกสุดท้าย

วีโอไอพียังต้องการผู้ช่วยสำหรับแต่ละโมดูลด้วยเหตุผลการแปล
คุณสามารถสร้างผู้ช่วยที่เรียกData.phpในแต่ละโมดูลและปล่อยว่างไว้


"การใช้งาน" ของจริงเท่านั้นที่ฉันพบสำหรับผู้ช่วยคือพวกเขารับประกันว่าจะเป็นซิงเกิล ฉันได้ทำงานเกี่ยวกับรหัสการศึกษาดั้งเดิมซึ่งกำลังโหลดคอลเลกชันภายในforeachลูปและความบ้าคลั่งทุกประเภท ฉันพบว่าการใช้ตรรกะที่น่ากลัวนี้ให้กับผู้ช่วยอีกครั้งและใช้มันเป็นวัตถุแคชเพื่อให้มีประโยชน์และออกจากห้องเล็ก ๆ เพื่อหาข้อผิดพลาดจากนักพัฒนาในอนาคตที่อาจโทรโดยไม่ตั้งใจgetModelแทนgetSingletonถ้าฉันวางมันไว้ในแบบจำลอง
ลุคร็อดเจอร์ส

@LukeRodgers ฉันเห็นประเด็นของคุณ แต่ฉันไม่คิดว่า "อาจโทรหา getModel แทน getSingleton" โดยไม่ได้ตั้งใจถือว่าเป็นเหตุผลที่แท้จริงในการใช้ผู้ช่วยเหลือ ฉันสามารถยืนยันว่าคุณสามารถ "โทร" ลบ "โดยไม่ตั้งใจ" แทน "บันทึก" คุณสามารถป้องกันสิ่งใดได้บ้างเพื่อหลีกเลี่ยงปัญหานี้ ฉันเดาว่า "ใส่ใจ" เป็นส่วนหนึ่งของการพัฒนาซอฟต์แวร์
Marius

ตกลง ในสถานการณ์เหล่านี้ฉันเดาว่าฉันแค่พยายามเขียนโค้ดเพื่อป้องกันมนุษยชาติ
ลุคร็อดเจอร์ส

คุณจะเพิ่มวิธีการที่กำหนดเองไปยังผู้ช่วยเหลือหลักได้อย่างไร
tecjam

13

คำถามมีสองด้าน:

  1. ฉันควรเขียนผู้ช่วยของตัวเองแล้วจะทำอะไรดี?
  2. ฉันควรใช้ผู้ช่วยเหลือหลักและเพื่ออะไร

1. การเขียนผู้ช่วย

โดยทั่วไปมีชั้นเรียนชื่อ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 ผู้ช่วยโมดูลมักจะดีพอสำหรับสิ่งต่าง ๆ เช่นนั้น


2. ใช้ผู้ช่วยเหลือ

การบริโภคผู้ช่วยหลักคือสิ่งที่คุณจะทำค่อนข้างบ่อย

ตัวอย่าง:

  • __()วิธีการแปล: Mage::helper('module-alias')->__('string to be translated')ในการได้รับการแปลของโมดูลที่เฉพาะเจาะจงที่คุณควรใช้ สิ่งนี้จะเกิดขึ้นโดยปริยายถ้าคุณใช้$this->__(...)ภายในเทมเพลตหรือบล็อกและหากคุณใช้translate="..."คุณลักษณะในไฟล์ XML
  • Mage::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:

  • ผู้ช่วยเหลือหลักมีเครื่องมือที่มีประโยชน์
  • คุณต้องการผู้ช่วยสำหรับการแปล
  • ผู้ช่วยควรไร้สัญชาติ
  • ในโมดูลของคุณเองหลีกเลี่ยงการใช้ตัวช่วยเป็นคอลเล็กชันฟังก์ชั่นที่หลากหลาย ในกรณีส่วนใหญ่คุณสามารถค้นหาสถานที่ที่เหมาะสมมากขึ้น

ฉันมักจะใช้ผู้ช่วยในการรวม ERP อย่างง่ายโดยใช้ไฟล์แฟลต สิ่งที่พวกเขาทำคือการเขียนและอ่านไฟล์จากไดเรกทอรีในท้องถิ่นและปรับปรุงวัตถุอื่น ๆ (ผลิตภัณฑ์คำสั่ง ฯลฯ ) พวกเขาไม่มีรัฐหรือตารางที่เกี่ยวข้องของตนเองในกรณีที่กล่าวถึง คุณทำอะไรกับเรื่องนี้?
musicliftsme

1
ที่ละเมิด "ไม่มีผลข้างเคียง" ใช้เวลาตามปกติของฉันในการอ่านและการเขียนไฟล์ReaderและWriterรูปแบบที่จริงทำมีสถานะ (อย่างน้อยทรัพยากรไฟล์) ตัวอย่างเช่นสำหรับการอ่านข้อมูลสถานะการสั่งซื้อจากไฟล์ CSV ฉันจะมี sth lika OrderStatusCsvReaderโมเดลที่ใช้โดยOrderStatusUpdaterโมเดล ด้วยวิธีนี้ฉันยังแยกข้อกังวล "อ่านข้อมูลจากไฟล์" และ "อัปเดตคำสั่งใน Magento"
Fabian Schmengler

4

Marius ถูกต้อง ฉันคิดว่าผู้ช่วยไร้สาระ

แต่ในทฤษฎีวีโอไอพีคุณควรใส่ทุกอย่างไว้ในตัวช่วยซึ่งไม่เปลี่ยนสถานะของวัตถุเช่นรับราคาที่จัดรูปแบบ

แต่ทุกสิ่งที่คุณสามารถนำไปเป็นผู้ช่วยคุณสามารถสร้างแบบจำลองได้เช่นกัน และคุณสามารถรับอินสแตนซ์ต่าง ๆ ของแบบจำลองซึ่งมีประโยชน์สำหรับการทดสอบ


2

ฉันค่อนข้างใหม่สำหรับ Magento แต่สำหรับฉันมันดูเหมือนว่า Helper เปรียบได้กับบริการของ Magento : "ชุดของฟังก์ชันซอฟต์แวร์ที่เกี่ยวข้องที่สามารถนำกลับมาใช้ใหม่เพื่อวัตถุประสงค์ที่แตกต่างกัน" โมดูลส่งออกฟังก์ชันการทำงานที่เสนอผ่านบริการ ใช้ตัวช่วยสำหรับฟังก์ชั่นที่คุณเชิญโมดูลอื่นให้ใช้

แบบจำลองควรมีวิธีการที่เกี่ยวข้องโดยตรงกับการรับหรือการตั้งค่าสถานะของวัตถุหรือที่เชื่อมโยงกับวัตถุที่เป็นตัวอย่างของแบบจำลอง


1

ตัวช่วยมีประโยชน์ในการป้องกันโค้ดที่ซ้ำกัน (ในรุ่นเทมเพลต ... ) และบางครั้งก็จำเป็น

  • สำหรับการตรวจสอบว่าคุณเปิดใช้งานโมดูลที่กำหนดเองหรือไม่คุณสามารถวางบางสิ่งที่เหมือนกับMage::getStoreConfigFlag('my/module/enabled')ไฟล์ทุกไฟล์ที่คุณต้องการตรวจสอบหรือใช้Mage::helper('my_module')->isEnabled()ประโยชน์ด้วย:
    • หากเช่นเส้นทางการเปลี่ยนแปลงที่กำหนดด้วยเหตุผลบางอย่างคุณก็ต้องปรับหนึ่งไฟล์
    • คุณสามารถเขียนisEnabled()เมธอดตัวช่วยเหลือและจะมีผลกับคลาสทั้งหมดที่ใช้แทนการเขียนหลายไฟล์
  • ที่ 13 @ วิธีการเขียนส่วนขยายที่กำหนดเอง? : อย่าเขียนคลาสเว้นแต่จะจำเป็น ใช้ผู้สังเกตการณ์และหากไม่สามารถใช้วิธีการช่วยเหลือที่ได้รับเป็นพารามิเตอร์และอินสแตนซ์ของคลาสที่คุณต้องการแทนที่ ผิด:แทนที่เพื่อเพิ่มวิธีการ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';

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.