Magento 2: การใช้งานผู้ช่วยที่เหมาะสม


9

ฉันเริ่มเห็นผู้คนมากขึ้นเรื่อย ๆ ที่ประกาศคลาสผู้ช่วยเหลือเพื่อให้สามารถใช้สิ่งต่อไปนี้ในไฟล์เทมเพลต:

$this->helper('Path/To/Helper/Class')->customMethod();

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

ดังนั้นนี่คือคำถามของฉัน:

  • สิ่งหนึ่งที่ควรเขียนในชั้นเรียนผู้ช่วย?
  • ในกรณีใดบ้างที่เกี่ยวข้องกับการใช้เมธอดตัวช่วยในเทมเพลต

คำตอบ:


20

อย่า
นี่เหมือนกับการใช้ObjectManager::getInstance()->create()ในเทมเพลต!
ใช้บล็อกที่กำหนดเองที่ได้รับผู้ช่วยเป็นผู้สร้างการอ้างอิงแทนและเพิ่มวิธีการพร็อกซี่ที่เรียกวิธีการช่วยเหลือ

ในเทมเพลต:

$block->customMethod()

ในบล็อก:

public function __construct(Path/To/Helper/Class $helperClass, ...other dependencies...)
{
    $this->helper = $helperClass;
    // ...other assignments and call to parent::__construct()
}

public function customMethod()
{
    return $this->helper->customMethod();
}

ในหลักการของ OOP พูดอย่างนี้เพื่อหลีกเลี่ยงการละเมิด "กฎหมายแห่ง Demeter" มันสรุปตรรกะทางธุรกิจในบล็อกแทนแม่แบบ ในฐานะที่เป็นผลข้างเคียงมันยังทำให้ตรรกะทดสอบได้มากขึ้นเมื่อมีการย้ายตรรกะลงในบล็อก

เกี่ยวกับตรรกะที่ใส่ลงในคลาสของผู้ช่วยเหลือฉันพบว่าในผู้ช่วย Magento 2 ส่วนใหญ่มีเหตุผลสำหรับบริการเช่นสิ่งที่ไม่ใช่แบบจำลอง แต่มีรหัสที่ใช้ซ้ำได้เช่นการจัดรูปแบบราคา (ซึ่งมีอยู่ในแกน แต่ฉันสามารถ ลองนึกถึงตัวอย่างที่ดีกว่าตอนนี้)


ฉันเห็นด้วยกับหลักการอย่างไรก็ตามดูเหมือนว่าการใช้การกำหนดค่าตามความชอบdi.xmlสำหรับประเภทคลาสบล็อกไม่เก็บโครงร่างบางอย่าง ฉันพยายามยกตัวอย่างเช่นสำหรับคลาส\Magento\Catalog\Block\Product\View\Type\Simpleเทมเพลตdefault.phtmlที่ใช้ในเทมเพลตของเราถูกละเว้น ไม่มีเงื่อนงำทำไมในขณะนี้
Sylvain Rayé

2
กระโดดเข้ามาที่นี่เพื่อรับข้อมูลที่ทันสมัยมากขึ้น ตั้งแต่ 2.2 ไม่แนะนำให้ขยายคลาสบล็อก หากจำเป็นต้องใช้ตรรกะการนำเสนอที่กำหนดเอง ViewModel ควรกำหนดและประกาศเป็นอาร์กิวเมนต์สำหรับ Block ใน layout.xml เนื่องจาก ViewModels ถูกสร้างขึ้นผ่าน Object Manager คุณสามารถโยงกราฟการพึ่งพาของคุณเองโดยไม่ต้องเปิดเผยตัวเองกับการทำลายการเปลี่ยนแปลงในการวางจำหน่าย Magento 2 ในอนาคต
John Hall

1

ฉันเห็นผู้ช่วยเป็นฟังก์ชันระดับโลกในโมดูลของคุณ (ขออภัยสำหรับคำว่า 'โลก') และผู้จัดการ / สัญญาบริการเป็นฟังก์ชั่นระดับโลกที่ได้รับอนุญาตให้ใช้ทั้งภายในและภายนอกโมดูลของคุณ

หากคุณปฏิบัติตามหลักการนี้คุณจะเห็นว่ามีผู้ใช้งานช่วยเหลือน้อยมากฉันใช้มันเป็นเครื่องมือห่อหุ้มการกำหนดค่าในโมดูลของฉันเท่านั้น

$this->configHelper->get(Config::PATH_TO_XML_PATH);
$this->configHelper->isEnabled();

ของประเภทนี้ หากคุณมีฟังก์ชั่นอื่น ๆ ที่อาจใช้งานได้นอกโมดูลของคุณให้สร้างผู้จัดการแทน

ในโลกอุดมคตินักพัฒนาบุคคลที่สามที่ต้องการฟังก์ชั่นการทำงานของโมดูลอื่น ๆ จะต้องดูในส่วนต่อประสานที่มีอยู่สำหรับที่เก็บและผู้จัดการและข้อมูลในApiโฟลเดอร์

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