ผู้ช่วยสร้างภาพใน Magento 2


26

การสร้างล่าสุดของ Magento 2 ได้ทำให้หายไปจากMageชั้นเรียน หมายความว่าเราสูญเสียMage::helperวิธีการไปแล้ว

มีเทคนิคการเปลี่ยน (โรงงานผู้ช่วยหรือไม่) สำหรับผู้ช่วย instantiating ใน Magento 2 หรือไม่? หรือว่าเราคาดว่าจะใช้คลาส Object manager ใหม่และเพียงยกตัวอย่างผู้ช่วยเป็นวัตถุเดี่ยว / แคชด้วยget(กับcreate)

คำตอบ:


31

ฉันเห็นว่าคุณมาถึงทางออกที่ถูกต้องเพียงแค่ต้องการสรุป

ตัวสร้างคอนสตรัคเตอร์ควรใช้เพื่อดึงตัวช่วย (หรือตัวอย่างอื่น ๆ ) ในชั้นเรียนที่คุณต้องการ:

class SomeClass
{
    public function __construct(\Magento\Core\Helper\Data $helper)
    {
        $this->helper = $helper;
    }

    public function doSmth()
    {
        $this->helper->someMethod();
    }
}

ขอให้สังเกตว่าไม่จำเป็นต้องมีการแสดงความคิดเห็น phpDocวีโอไอพีจะอ่านลายเซ็นของคอนสตรัคเตอร์โดยตรงเพื่อค้นหาว่าต้องพึ่งพาอะไรบ้าง

\ Magento \ Core \ Helper \ Factory ควรใช้เฉพาะในกรณีที่หายากเหล่านั้นเมื่อคุณต้องโทรหาผู้ช่วยเหลือหลายคนหรือคุณไม่ทราบว่าคุณต้องการสิ่งใด

การใช้งานของผู้จัดการวัตถุโดยตรงท้อแท้อย่างเคร่งครัด ดังนั้นโปรดหลีกเลี่ยงการใช้:

\Magento\Core\Model\ObjectManager::getInstance()

มีเฉพาะสำหรับซีเรียลไลซ์เซชั่น / ดีซีเรียลไลเซชันเท่านั้น


อย่าใช้สแตติกเนื่องจากไม่สามารถทดสอบกับหน่วย PHP และใช่มันเป็นกำลังใจ การอ้างอิง M2 ทั้งหมดจะกระทำผ่าน Constructor และจัดการโดย Object Manager ภายในและจะเรียกคืนเป็น Singleton และไม่ใช้ _ เพื่อระบุคุณสมบัติการมองเห็นการตั้งชื่อ M2 ทั้งหมดควรใช้ camecase
PartySoft

@Anton Kril ถ้าเราใช้helperในแม่แบบ$this->helper('Magento\Catalog\Helper\Image')มันเป็นไปตามแนวปฏิบัติที่ดีที่สุด?
Khoa TruongDinh

2
ไม่มันไม่ เทมเพลตควรอ้างอิงบล็อกเท่านั้น ผู้ช่วยควรหลีกเลี่ยง
Anton Kril

10

ดูเหมือนว่าผู้สนับสนุนของ Magento จะใช้ระบบฉีดพึ่งพาอัตโนมัติใหม่เพื่อให้ผู้ช่วยเหลือและแบบจำลองเข้าสู่วัตถุผ่านทางคอนสตรัคเตอร์ของวัตถุ

รุ่นสั้น? ถ้าคุณมีวัตถุที่ instantiated โดยผู้จัดการวัตถุที่และการตกแต่งคอนสตรัคกับ PHPDoc ได้@param , และพารามิเตอร์ที่มีชุดประเภทคำใบ้ที่เหมาะสมผู้จัดการวัตถุอัตโนมัติจะยกตัวอย่างผู้ช่วย (หรือผมเชื่อว่าวัตถุอื่น ๆ ) สำหรับคุณ

ตัวอย่างเช่นนวกรรมิกต่อไปนี้จะฉีดตัวช่วยดาต้าคอร์เข้าไปในวัตถุ

/**
* @param \Magento\Core\Helper\Data $coreData
*/        
public function __construct(\Magento\Core\Helper\Data $coreData)
{
    $this->_coreHelper = $coreData;            
}

นี่คือคำตอบที่ถูกต้อง - นักสืบผู้ยิ่งใหญ่ ไม่ชัดเจนเลยแม้แต่น้อยหลังจากขุดมามาก
philwinkle

2
ตกลง ... ตอนนี้หัวของฉันเจ็บ ... มาก คุณหมายความว่าเราควรจะใช้ PHPDoc เพื่อ "เขียน" รหัส? นี่คือความบ้า. ฉันเลิกแล้ว
Marius

@Marius hahaha นี่ไม่ใช่เรื่องผิดปกติ - บล็อกของ Alan อธิบายได้บ้าง
philwinkle

3
@philwinkle ฉันอ่านบทความของเขาแล้ว น่าสนใจมาก แต่ฉันก็ยังบอกว่านี่เป็นบ้า เรียกฉันว่าล้าสมัย แต่รหัส "ย้อนกลับไปในสมัยของฉัน" คือรหัสและความคิดเห็นเป็นสิ่งที่เกือบจะไม่มีใครใส่ใจที่จะเขียน
Marius

โอ้ ... และโดยวิธีการ +1 คำถามที่ดี & คำตอบที่ดี
Marius

7

นอกเหนือจากคำตอบข้างต้นหากคุณต้องใช้ตัวช่วยในเทมเพลต phtml คุณสามารถทำได้ดังนี้:

$this->helper('[Vendor]\[Module]\Helper\[Helper Name]');

ฉันหวังว่ามันจะมีประโยชน์ถ้าใครไม่เคยรู้จักมาก่อน;)


6

วิธีที่ผู้ช่วยเหลือถูกสร้างอินสแตนซ์ (อย่างน้อยสำหรับโมดูลแบ็กเอนด์ (~ dev50) ใหม่) ผ่านทาง helperFactory:

/**
 * Return helper object
 *
 * @param string $name
 * @return \Magento\Core\Helper\AbstractHelper
 */
public function helper($name)
{
    return $this->_helperFactory->get($name);
}

ซึ่งโดยพื้นฐานแล้วเป็นเพียงโรงงานประเภทเฉพาะ เช่น Magento \ Core \ Block \ Context บรรทัดที่ 143 (dev50) ซึ่งเป็นส่วนหนึ่งของ Constructor:

\Magento\Core\Model\Factory\Helper $helperFactory

โรงงานผู้ช่วยจะส่งคืนโมเดลที่ร้องขอตามชื่อคลาสและตรวจสอบให้แน่ใจว่าเป็นinstanceofคลาสนามธรรมของผู้ช่วยเหลือ:

/**
 * Get helper singleton
 *
 * @param string $className
 * @param array $arguments
 * @return \Magento\Core\Helper\AbstractHelper
 * @throws \LogicException
 */
public function get($className, array $arguments = array())
{
    $className = str_replace('_', '\\', $className);
    /* Default helper class for a module */
    if (strpos($className, '\Helper\\') === false) {
        $className .= '\Helper\Data';
    }

    $helper = $this->_objectManager->get($className, $arguments);

    if (false === ($helper instanceof \Magento\Core\Helper\AbstractHelper)) {
        throw new \LogicException(
            $className . ' doesn\'t extends Magento\App\Helper'
        );
    }

    return $helper;
}

หากคุณจะใช้สิ่งนี้ด้วยตัวเองดูเหมือนว่า Magento core กำลังโหลดมันด้วยหนึ่งในสองวิธี:

ม้วนโรงงานของคุณเอง:

$objectManager = \Magento\Core\Model\ObjectManager::getInstance();

$helperFactory = $objectManager->get('\Magento\Core\Model\Factory\Helper');
$helper = $helperFactory->get('\PulseStorm\Commercebug\Helper\Data');

หรือเพียงแค่คว้ามันโดยตรง:

$helper = \Magento\Core\Model\ObjectManager::getInstance()->get('Magento\Core\Helper\Data');

1
+1 สำหรับข้อมูลที่เป็นประโยชน์ แต่คุณต้องการยกตัวอย่างโรงงานโดยตรงเช่นนั้นหรือไม่ หรือผู้ช่วยโรงงานเดียวควรสร้างอินสแตนซ์กับ Object Manager เป็นคลาสที่แคชด้วยgetหรือไม่
Alan Storm

มันยังไม่ชัดเจนนักเนื่องจากโรงงานผู้ช่วยนั้นสืบทอดมาจาก \ Mage \ Core \ Block \ Abstract - ฉันคิดว่าความตั้งใจจะจัดหาโรงงานผู้ช่วยของคุณเอง มันไม่ได้มีลักษณะเหมือนพวกเขากำลังจงใจสร้างเดี่ยวสำหรับโรงงานแม้ว่า
philwinkle

ดูเหมือนว่าฉันต้องการ / แหล่งที่ดีที่สุดคือการติดตามว่า _helperFactory ถูกฉีดเข้าไปในวัตถุเหล่านั้นอย่างไรและดูว่าทีมหลักสร้างอินสแตนซ์ของมันได้อย่างไร
อลันสตอร์ม

สรุปการทำให้เข้าใจง่ายของฉันไม่ถูกต้องเช่นเดียวกับตัวสร้างต้องการอินสแตนซ์ของ ObjectManager ฉันจะแก้ไขในไม่ช้า
philwinkle

ดูการแก้ไข มันควรจะทำงาน - ยากที่จะกำหนดในขณะนี้เนื่องจากสภาพแวดล้อม cli shell ของฉันไม่ได้โหลดอินสแตนซ์การตั้งค่าการจัดเก็บตามที่คาดไว้ นี่ควรจะเพียงพอที่จะทำให้คุณได้รับเส้นทางที่ถูกต้อง
philwinkle

0

ลองด้วยวิธีนี้

$helper = \Magento\Framework\App\ObjectManager::getInstance()->get('Xx\Xx\Helper\Xx');

การใช้ Object Manager โดยตรงนั้นไม่ได้รับการสนับสนุนอย่างเคร่งครัด
sv3n

@ sv3n คุณช่วยอธิบายได้ไหมอะไรคือสาเหตุ ขอบคุณ
Thushan

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