__construct และ _construct ใน magento2 คืออะไร


21

ใน Magento 2 คลาสส่วนใหญ่มีวิธีการสร้าง ( __constructและ_construct) ทั้งสองนี้ ความแตกต่างระหว่างพวกเขาคืออะไร?

คำตอบ:


17

ฉันไม่แน่ใจว่ามันเปลี่ยนไประหว่างวีโอไอพี 1 และวีโอไอพี 2 หรือเปล่าบางทีฉันก็จะไปกับสิ่งที่ฉันรู้จากวีโอไอพี 1

_constructจะถูกเรียกว่าหลังจากที่__construct

__constructวิธีดั้งเดิมของ PHP ไม่ควรเขียนทับหรือใช้ในรหัสของคุณ _constructหากคุณต้องการที่จะรันโค้ดในวิธีที่ปลอดภัยในการเริ่มต้นของการใช้งานในชั้นเรียน

วีโอไอพีจะใช้เนทีฟ__constructเพื่อให้แน่ใจว่าทุกอย่าง 'พร้อม' สำหรับชั้นเรียนที่จะใช้เช่นการกำหนดแท็กแคชที่เหมาะสมสำหรับรุ่นบางรุ่น


15

_constructวิธีเป็น"Varien ประดิษฐ์"ใช้ในการห่อตรรกะเริ่มต้นบางอย่างในรูปแบบผู้ช่วยเหลือและบล็อก

ดังนั้นจึงเป็นเรื่องผิดปกติที่จะเปลี่ยนหรือประกาศวิธี__construct ()ดั้งเดิมใน M1 Models / Blocks หรือ Helpers เนื่องจากเรามักใช้โรงงานวีโอไอพี อย่างไรก็ตามไม่มีปัญหา / การปฏิบัติที่ไม่ดีเกี่ยวกับการใช้งาน (ถ้าคุณต้องการความเข้ากันได้)

ใน M2 เมธอด _construct ()ยังคงปรากฏอยู่ในบางส่วนและใช้เพื่อจุดประสงค์เดียวกัน แต่ตอนนี้ (ใน M2) ลอจิก DI ทั้งหมดถูกนำไปใช้โดย __constructor () ดังนั้นคุณจะพบการประกาศโครงสร้างจำนวนมากในฐานรหัส

BTW ไม่มีโรงงานอีกต่อไปMage::getModel()ใน M2

ในคำอื่น ๆ :

_construct ()วิธีการดำเนินการโดยวีโอไอพีในบางชั้นเรียนและก็เรียกโดยอัตโนมัติภายใน__constructประกาศฟังก์ชันดังนั้นหากคุณกำลังขยายชั้นวีโอไอพีเช่นรุ่นคุณสามารถใช้มันในการดำเนินการสิ่งบางอย่างหลังจากการสร้างวัตถุ

ใน Resource Model หรือ Model Class คุณควรกำหนด_construct()วิธีการเพื่อกำหนดตารางและ primary_key

ในอีกทางหนึ่ง__โครงสร้างเป็นวิธีดั้งเดิมของ PHP (ภาษา OO ทั้งหมดมีหนึ่งภาษา) __constructถูกเรียกใช้ทุกครั้งที่คุณสร้างอินสแตนซ์ของวัตถุ นั่นคือทั้งหมดที่

ตัวอย่าง:

วีโอไอพี \ Framework \ รุ่น \ ResourceModel \ AbstractResource

/**
 * Abstract resource model
 */
abstract class AbstractResource
{
    /**
     * Main constructor
     */
    public function __construct()
    {
        /**
         * Please override this one instead of overriding real __construct constructor
         */
        $this->_construct();
    } ...

วีโอไอพี \ Framework \ รุ่น \ ResourceModel \ Db \ AbstractDb

/**
 * Class constructor
 *
 * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
 * @param string $connectionName
 */
public function __construct(\Magento\Framework\Model\ResourceModel\Db\Context $context, $connectionName = null)
{
    $this->transactionManager = $context->getTransactionManager();
    $this->_resources = $context->getResources();
    $this->objectRelationProcessor = $context->getObjectRelationProcessor();
    if ($connectionName !== null) {
        $this->connectionName = $connectionName;
    }
    parent::__construct();
}

คุณช่วยยกตัวอย่างได้ไหม
zed Blackbeard

ใน M2? ฉันสามารถปรับปรุงคำตอบเพื่อทำให้ความแตกต่างชัดเจนขึ้น แต่ฉันไม่รู้ว่าจำเป็นต้องมีตัวอย่างหรือไม่
MauroNigrele

ฉันสนใจในความคิดเห็นของคุณเกี่ยวกับสิ่งที่เกี่ยวข้องกับ DI และ __construct () ดูเหมือนว่า "ตรรกะลอจิก" ใน Magento2 นั้นถูกนำมาใช้เป็นรูปแบบการต่อต้าน การรันการอัปเดตผู้แต่งขึ้นอยู่กับจำนวนโมดูลสามมิติที่คุณเพิ่มไว้กับโมดูลของคุณซึ่งมักจะนำไปสู่ความจำเป็นในการดีบั๊กเพิ่ม params ในคอนสตรัคเตอร์ที่ไม่ได้ใช้จริงในคลาสลูก ไม่แน่ใจว่าควรจะเรียกว่า "การฉีดพึ่งพา" แต่ต้องพึ่งพาการพึ่งพาหรือบางสิ่งบางอย่าง ...
someGuyOnTheWeb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.