Magento 2: นักพัฒนาโมดูลควรอ่านไฟล์กำหนดค่าของตัวเองอย่างไร


20

สถานการณ์จำลอง: ฉันเป็นผู้พัฒนาโมดูล Magento 2 app/etcผมต้องการสร้างแฟ้มการกำหนดค่าใน ฉันต้องการให้ไฟล์นี้ "กำหนดขอบเขต" ตามพื้นที่

app/etc/my_file.xml
app/etc/frontend/my_file.xml
app/etc/adminhtml/my_file.xml

ใน Magento 1 ฉันแค่สร้างconfig.xmlและเป็นในแบบของฉัน การกำหนดขอบเขตพื้นที่เกิดขึ้นในไฟล์ XML นั้นเอง อย่างไรก็ตาม Magento 2 เข้าใกล้สิ่งนี้แตกต่างกันมาก

ใน Magento 2 ฉันควรสร้างไฟล์คลาสใดเพื่ออ่านไฟล์การกำหนดค่าที่กำหนดขอบเขตเหล่านี้ ยังไม่ชัดเจนจากแหล่งที่มาของวีโอไอพี 2 ว่า "วิธีการที่ถูกต้อง" คืออะไร รหัสหลักมีหลายวิธีและไม่มีการทำเครื่องหมายด้วย@apiวิธีใดเลย สิ่งนี้ทำให้ยากที่จะทราบวิธีดำเนินงานภารกิจนักพัฒนาโมดูลทั่วไปนี้ ในฐานะที่เป็นผลข้างเคียงที่สองก็ทำให้ยากที่จะทราบว่าผู้พัฒนาโมดูล Magento ควรอ่านจากไฟล์กำหนดค่าหลักได้อย่างไร

ในอีกด้านหนึ่งดูเหมือนว่า "สิ่งที่ถูกต้อง" ที่จะทำคือสร้างวัตถุตัวอ่านระบบไฟล์ ตัวอย่างเช่น Magento ดูเหมือนว่าจะโหลดimport.xmlไฟล์ดังต่อไปนี้

#File: vendor/magento/module-import-export/Model/Import/Config/Reader.php
namespace Magento\ImportExport\Model\Import\Config;

class Reader extends \Magento\Framework\Config\Reader\Filesystem
{

    public function __construct(
        //...
        $fileName = 'import.xml',
        //...
    ) {
        parent::__construct(
            $fileResolver,
            $converter,
            $schemaLocator,
            $validationState,
            $fileName,
            $idAttributes,
            $domDocumentClass,
            $defaultScope
        );
    }
    //...
}        

Magento\Framework\Config\Reader\Filesystemคลาสฐานดูเหมือนจะมีรหัสเพื่อแก้ไขขอบเขตพื้นที่

อย่างไรก็ตามไฟล์การกำหนดค่า Magento บางส่วนดูเหมือนจะหลีกเลี่ยงรูปแบบนี้ ในขณะที่มีผู้อ่านสำหรับไฟล์เหล่านี้ ( event.xmlในตัวอย่างนี้)

vendor/magento/framework/Event/Config/Reader.php

นอกจากนี้ยังมีคลาส "ข้อมูลที่กำหนดขอบเขต" ซึ่งใช้ตัวอ่านเหล่านี้

#File: vendor/magento/framework/Event/Config/Data.php
class Data extends \Magento\Framework\Config\Data\Scoped
{
    public function __construct(
        \Magento\Framework\Event\Config\Reader $reader,
        //...
    ) {
        parent::__construct($reader, $configScope, $cache, $cacheId);
    }
}

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

มีเส้นทางที่ชัดเจนสำหรับผู้พัฒนาโมดูล Magento 2 หรือไม่? หรือนี่เป็นเพียงบางสิ่งที่ผู้พัฒนาโมดูล Magento 2 ควรเข้าหาด้วยตนเองและความวุ่นวายที่เกิดขึ้น / การโหลดการกำหนดค่าที่ไม่ได้มาตรฐานเป็นเพียงค่าใช้จ่ายในการทำธุรกิจ

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


ฉันคิดว่านี่สามารถช่วยได้: magento.stackexchange.com/q/51915/146
Marius

คุณเคยเห็น PR นี้โดย @vinai github.com/magento/magento2/pull/1410หรือไม่ ฉันคิดว่าถ้าคุณไม่มีข้อกำหนดพิเศษคุณสามารถหมุนไฟล์ปรับแต่งของคุณเองด้วยประเภทเสมือน
Kristof ที่ Fooman

คำตอบ:


4

ในการสร้างประเภทการกำหนดค่าใหม่ผู้พัฒนาโมดูลควรสร้างคลาสประเภทการกำหนดค่าที่ลูกค้าจะใช้ในการกำหนดค่า

เพื่อทำให้คลาสประเภทเหล่านี้ง่ายที่สุดเท่าที่จะทำได้พฤติกรรมทั้งหมดของการอ่านไฟล์คอนฟิกูเรชันและข้อมูลแคชถูกย้ายไปที่\Magento\Framework\Config\DataInterfaceด้วยการปรับใช้สองแบบ

  • \Magento\Framework\Config\Data - สำหรับประเภทการกำหนดค่าที่เหมาะสมที่จะโหลดในขอบเขตเดียวเท่านั้น (eav_attributes.xml ในโกลบอลเท่านั้น)
  • \Magento\Framework\Config\Data\Scoped - สำหรับประเภทการกำหนดค่าที่สามารถโหลดในขอบเขตที่แตกต่างกัน (events.xml - ทั่วโลกและต่อพื้นที่)

การกำหนดค่าทุกประเภทควรมีConfig\DataInterfaceวัตถุที่กำหนดค่าไว้ล่วงหน้า การกำหนดค่าสามารถทำได้ทั้งกับประเภทเสมือนหรือมีมรดก

แม้ว่าผู้พัฒนาโมดูลสามารถสืบทอดประเภทการกำหนดค่าทางเทคนิคได้Config\DataInterfaceแต่ก็ไม่แนะนำให้ขยายจากคลาสหลัก ดีกว่าเสมอเพื่อใช้องค์ประกอบ

ตอนนี้\Magento\Framework\Config\DataและData\Scopedทำการแคชและมอบหมายการตั้งค่าการอ่าน\Magento\Framework\Config\ReaderInterfaceเท่านั้น ReaderInterfaceควรให้การกำหนดค่าที่ถูกต้องในรูปแบบของอาร์เรย์ PHP สำหรับขอบเขตที่ร้องขอ (หากการกำหนดค่าถูกกำหนดขอบเขต) การใช้งานที่หลากหลายReaderInterfaceนั้นเป็นไปได้ (ตัวอย่างเช่นการกำหนดค่าการอ่านจากฐานข้อมูล) แต่ Magento จะส่งผู้อ่านทั่วไปเพียงรายเดียวเท่านั้น: \Magento\Framework\Config\Reader\Filesystem.

\Magento\Framework\Config\Reader\Filesystem การดำเนินการทั้งหมดที่จำเป็นสำหรับการอ่านไฟล์จากระบบไฟล์แบบแยกส่วน: อ่านไฟล์ผสานและตรวจสอบความถูกต้อง

ทุกคนควรจะมีการกำหนดค่าอินสแตนซ์แยกของConfig\DataInterface Config\ReaderInterfaceเป็นอินสแตนซ์ใด ๆ ในระบบผู้อ่านที่เฉพาะเจาะจงสามารถกำหนดค่าด้วยชนิดเสมือนหรือสืบทอด เอกสารวีโอไอพีอธิบายการFilesystemอ้างอิงทั้งหมด

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


1

ดูเหมือนว่าเอกสารอย่างเป็นทางการมีคำตอบสำหรับคำถามของคุณ


1
ขอบคุณสำหรับการตอบกลับ แต่ฉันไม่แน่ใจว่าเอกสารจะตอบคำถามของฉันได้อย่างไร มันแสดงรายการอินเทอร์เฟซจำนวนมาก (ซึ่งมีประโยชน์ +1 สำหรับสิ่งนั้น) ที่มีอยู่ แต่ไม่กระทบยอดข้อเท็จจริงของการใช้งานอินเทอร์เฟซเหล่านั้นอย่างเป็นรูปธรรม ( Magento\Framework\Config\DataและMagento\Framework\App\Config) ไม่ได้ถูกทำเครื่องหมายด้วย @api ถ้าทิ้งไว้กับเอกสารประกอบเพียงอย่างเดียวฉันจะอยู่ภายใต้สมมติฐานว่าในฐานะผู้พัฒนาโมดูลไม่มีระบบมาตรฐานสำหรับการสร้างและอ่านไฟล์การกำหนดค่าและฉันสามารถทำสิ่งที่ฉันต้องการได้ ดูเหมือนจะไม่ถูกต้อง
Alan Storm

คุณสามารถอธิบายกรณีและปัญหาเมื่อคุณต้องการอ่านการกำหนดค่าสำหรับโมดูลอื่นได้หรือไม่? สำหรับฉันผู้อ่านการกำหนดค่าเป็น API ส่วนบุคคลของโมดูล
KAndy

หากนักพัฒนาต้องการมีส่วนร่วมใน Magento core หากนักพัฒนาทำงานบนหลายโมดูลไม่ใช่ทั้งหมดที่พวกเขาควบคุมและไม่ต้องการแก้ให้หายจากแผนภูมิ UML เพื่ออ่านค่าจากไฟล์กำหนดค่า ดูเพิ่มเติม - กรอบ PHP อื่น ๆ ส่วนใหญ่พร้อมระบบกำหนดค่า โดยไม่คำนึงว่าถ้าเจตนาของทีมหลักของวีโอไอพี 2 คือการกำหนดค่าโมดูลนั้นเป็นแบบส่วนตัวและแบบกำหนดเองต่อโมดูลควรจะระบุไว้ที่ใดที่หนึ่ง
Alan Storm

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

2
API ใด ๆ ที่ไม่ได้ใส่คำอธิบายประกอบด้วย @api นั้นเป็นส่วนตัวในแง่ที่ว่าถ้าคุณใช้คุณต้องรับผิดชอบต่อปัญหาความเข้ากันได้ / api ย้อนหลัง \ Magento \ Framework \ Config \ ReaderInterface มีคำอธิบายประกอบ \ @api
KAndy

0

ในขณะที่ไม่มีการเขียนนี้ดูเหมือนว่าจะเป็นมาตรฐานคือการอ่านแผนผังการผสานใน Magento 2 แต่ละโมดูลใช้คลาสการอ่านการกำหนดค่าของตัวเองซึ่งหมายความว่ามันขึ้นอยู่กับนักพัฒนาแต่ละคนที่จะตัดสินใจว่าพวกเขาต้องการรวม เกิดขึ้น. แม้ว่าวีโอไอพีจะเสนอคลาสหุ้นให้ทำเช่นนี้แม้ในรหัสหลักการใช้คลาสเหล่านี้ไม่สอดคล้องกัน

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