การฉีดการพึ่งพาในรูปแบบวีโอไอพี CRUD / บทคัดย่อ


12

เป็นไปได้หรือไม่ที่จะฉีดการพึ่งพาลงในโมเดล Magento 2 CRUD?

นั่นคือ - วีโอไอพี 2 มีคลาสโมเดลนามธรรมพื้นฐาน: Magento\Framework\Model\AbstractModel. ถ้าคุณต้องการสร้างวัตถุสร้าง, อ่าน, อัปเดตและลบแบบง่ายคุณจะขยายคลาสนี้ด้วยคลาสของคุณเอง

class Foo extends Magento\Framework\Model\AbstractModel
{
}

เป็นไปได้หรือไม่ที่จะฉีดการพึ่งพาใน__constructวิธีการของแบบจำลองของคุณ? เมื่อฉันลองฉันจะได้รับข้อผิดพลาดต่อไปนี้

ข้อผิดพลาดร้ายแรง: ไม่สามารถยกตัวอย่างคลาสนามธรรม Magento \ Framework \ Model \ ResourceModel \ AbstractResource

ผู้กระทำผิดน่าจะเป็นAbstractModelของ__constructวิธีการ

public function __construct(
    \Magento\Framework\Model\Context $context,
    \Magento\Framework\Registry $registry,
    \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
    \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
    array $data = []
) {

มีคำใบ้สองประเภทในตัวสร้างนี้ ( Magento\Framework\Model\ResourceModel\AbstractResource, Magento\Framework\Data\Collection\AbstractDb) ที่ไม่ใช่อินเตอร์เฟสของตัวจัดการวัตถุของวีโอไอพี พวกมันเป็นคลาสนามธรรม เมื่อฉันขยายชั้นเรียนนี้และพยายามที่จะเพิ่มการพึ่งพาการฉีดของฉัน

class Foo extends Magento\Framework\Model\AbstractModel
{
    public function __construct(
        \Magento\Framework\Model\Context $context,
        \Magento\Framework\Registry $registry,
        \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
        \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
        array $data = [],
        \Package\Module\Model\Mine $mine,

    ) {
        //...
        parent::__construct($context, $registry, $resource, $resourceCollection, $data);

    }
}

Magento bails เมื่อตัวจัดการวัตถุพยายามยกตัวอย่างคลาสนามธรรม

ฉันสามารถ "แก้ไข" สิ่งนี้ได้โดยการย้ายการพึ่งพาวัตถุของฉันต่อหน้าคลาสนามธรรม

    public function __construct(
        \Magento\Framework\Model\Context $context,
        \Magento\Framework\Registry $registry,

        \Package\Module\Model\Mine $mine,

        \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
        \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
        array $data = [],
    ) {  

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

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

คำตอบ:


9

ก่อนอื่นคอนสตรัคเตอร์คือ api ส่วนตัวของชั้นเรียน ฟังก์ชั่นการสร้างมีความหมายพิเศษและไม่จำเป็นต้องมีรายการ / คำสั่งของข้อโต้แย้งเช่นเดียวกับในระดับผู้ปกครอง

เป็นไปได้หรือไม่ที่จะฉีดการพึ่งพาลงในโมเดล Magento 2 CRUD?

ใช่แน่นอน

ปลอดภัยไหม

ใช่ แต่ Magento Object Manager ถือว่าพารามิเตอร์ทางเลือกทั้งหมดอยู่ท้ายรายการและพารามิเตอร์ที่จำเป็นหลังจากตัวเลือกจะไม่ได้รับการแก้ไข

$ resource ข้อโต้แย้ง $ resourceCollection เป็นแบบดั้งเดิม แต่ยังคงใช้กันอย่างแพร่หลายในคลาสรุ่น โมเดลส่วนใหญ่ใช้รหัสในลักษณะนี้เพื่อเริ่มต้นทรัพยากรและคลาสการรวบรวม

protected function _construct() { 
    $this->_init('Magento\AdminNotification\Model\Resource Model\Inbox'); 
}

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


@Kanday ฝ่ายวิศวกรรม / สถาปัตยกรรมของ Magento สร้างคำแถลงสาธารณะที่ไม่เกี่ยวข้องกับคอนสตรัคเตอร์ในคลาสหลักหรือไม่? หรือว่าเป็นเพียงความหวังของคนส่วนใหญ่ที่ทำงานกับมัน?
Alan Storm

ฉันจะไม่เรียกมันว่า "ไม่เกี่ยวข้อง" เพียงแค่ OM จะส่งอาร์กิวเมนต์ที่จำเป็นให้กับคอนสตรัคเตอร์ของคุณและมันไม่ได้ขึ้นอยู่กับลำดับในคลาสพาเรนต์ ยิ่งกว่านั้น IN ใช้ชื่อพารามิเตอร์ดังนั้นตอนนี้จะเป็นการดีกว่าที่จะไม่เปลี่ยนค่า (มันแตกต่างจากภาษา PHP ซึ่งคุณสามารถเปลี่ยนชื่อพารามิเตอร์ตามที่คุณต้องการ)
KAndy

ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณพูด คุณกำลังบอกว่าในบางจุดในอนาคตรหัสระบบวีโอไอพีหลักอาจเริ่มต้นการรักษาคำสั่งอาร์กิวเมนต์ / พารามิเตอร์เป็นสำคัญอีกครั้ง?
Alan Storm

ฉันเชื่อว่าไม่มี
KAndy

ขอบคุณอีกครั้ง! FWIW และสำหรับชาว Google ดูเหมือนว่ามันควรจะปลอดภัย จากสิ่งที่ฉันสามารถบอกได้ว่าไม่มีรหัสระบบวีโอไอพีที่สุ่มตัวอย่างแบบสุ่มโดยอัตโนมัติโดยสมมติว่าพารามิเตอร์ของตัวสร้าง
Alan Storm

6

ดูเหมือนว่าจะปลอดภัย อย่างน้อยวีโอไอพีก็กำลังทำสิ่งนี้อยู่หลายแห่ง ดูวิธีการสร้างโครงสร้าง __ ในรายการของคลาส (ไม่ใช่พิเศษ) ต่อไปนี้

  • \ วีโอไอพี \ ธีม \ รุ่น \ ธีม \ ไฟล์
  • \ วีโอไอพี \ ธีม \ รุ่น \ ออกแบบ
  • \ วีโอไอพี \ ขาย \ รุ่น \ สั่งซื้อ \ ใบรับ

น่าเสียดายที่ฉันไม่สามารถตอบคำถามส่วนอื่นของคุณได้


4
  1. คุณใช้โมเดลของคุณอย่างไร
  2. ในกรณีของคุณ$mineเป็นที่ต้องการพารามิเตอร์ในขณะที่$resource, $resourceCollectionและ$dataเป็นตัวเลือก พารามิเตอร์ที่เป็นทางเลือกควรจะอยู่ได้ตลอดมิฉะนั้นจะเป็นไปไม่ได้ที่จะทำงานร่วมกับพวกเขาเช่นเดียวกับที่เป็นทางเลือก ดังนั้นดูเหมือนว่าฉันตกลงที่คุณควรระบุ$mineก่อนพารามิเตอร์ตัวเลือกใด ๆ

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

บางรุ่นอาจยังคงใช้พารามิเตอร์ทางเลือกเหล่านี้เพื่อส่งผ่านโมเดลทรัพยากรที่กำหนดเอง ตัวอย่างเช่นgithub.com/magento/magento2/blob/develop/app/code/Magento/ …
BuskaMuza

Magento ใช้การสะท้อนเพื่อกำหนดว่าพารามิเตอร์เป็นตัวเลือกหรือไม่ และ PHP พิจารณาพารามิเตอร์ทั้งหมดยืนอยู่หน้าพารามิเตอร์ต้องเป็นที่ต้องการ ดังนั้นหากคุณย้ายไปข้าง$mineหน้าพารามิเตอร์ตัวเลือกพวกเขาจะกลายเป็นตัวเลือกและ Magento เพิ่งผ่านค่าเริ่มต้น ( null, array()) หากคุณใส่พารามิเตอร์ที่ต้องการหลังจากพารามิเตอร์ตัวเลือก PHP จะพิจารณาพารามิเตอร์เสริมตามที่จำเป็นและ Magento พยายามยกตัวอย่างพารามิเตอร์เหล่านั้น (แต่ไม่มีการกำหนดค่าตามความชอบ)
BuskaMuza

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