คำถามติดแท็ก dependency-injection

หมายถึงคำถามเกี่ยวกับการฉีด Magento 2 Dependency

3
ความแตกต่างระหว่างประเภทและ virtualType คืออะไร
ในdi.xmlที่มาพร้อมกับ Magento2 มีโหนดและโหนดtype virtualTypeคำถามของฉันคือสิ่งนี้virtualTypeและควรใช้ในกรณีtypeใด ในบางสถานที่ดูเหมือนลิงค์สัญลักษณ์หรือเขียนใหม่: <virtualType name="Magento\Core\Model\Session\Storage" type="Magento\Framework\Session\Storage"> เมื่อเส้นทางเต็มหนึ่งถูกเปลี่ยนเป็นอีกเส้นทางหนึ่ง แต่ในที่อื่น ๆ ดูเหมือนว่าจะใช้เป็นวิธีในการกำหนดนามแฝงที่สั้นกว่า <virtualType name="lessFileSourceBase" type="Magento\Framework\View\File\Collector\Base">

3
สิ่งที่กระตุ้นให้เกิดการสร้างโรงงานใน Magento 2
Magento 2 มีไฟล์คลาสจำนวนหนึ่งที่สร้างไว้ล่วงหน้าหรือสร้างขึ้นทันที พวกเขาอาศัยอยู่ใน var/generated ไฟล์ที่สร้างขึ้นเหล่านี้รวมถึงคลาสของโรงงาน จากเอกสารฉันเข้าใจว่าโปรแกรมเมอร์ใช้คลาสโรงงานเพื่ออินสแตนซ์วัตถุ "ที่ไม่สามารถฉีดได้" วัตถุ "ที่ไม่สามารถฉีดได้" เป็นวัตถุที่ไม่สามารถเพิ่มผ่าน__constructorการฉีดตามปกติเนื่องจากต้องให้ผู้ใช้ป้อนอินสแตนซ์ สิ่งที่ไม่ชัดเจนจากเอกสารประกอบคือวีโอไอพี 2 รู้ว่ามันต้องการสร้างคลาสโรงงาน บิตนี้ หากตัวจัดการวัตถุที่พบไม่มีอยู่ในโหมดรันไทม์หรือคอมไพเลอร์ตัวจัดการวัตถุจะสร้างโรงงาน ทำให้ดูเหมือนว่าถ้าฉันใช้คลาสโรงงานในตัวจัดการวัตถุ (หรือโดยการขยายในการพึ่งพา __ คอนสตรัคชันการฉีด) สิ่งที่วีโอไอพี 2 จะสร้างขึ้นมาเพื่อฉัน แต่ผู้จัดการวัตถุจะรู้ได้อย่างไรว่าสิ่งที่ฉันขอเป็นโรงงานหรือไม่ นอกจากนี้ดูเหมือนว่าจะมีสอง คำสั่งสำหรับการสร้างโดยอัตโนมัติ (หรือ "รวบรวม") คลาสที่สร้างขึ้นทั้งหมด การรันคำสั่งอย่างใดอย่างหนึ่งเหล่านี้จะสร้างคลาส Factory จำนวนมาก ไฟล์คำสั่งกำหนดค่าและ / หรือไฟล์ใดที่คำสั่งเหล่านี้มองหาเพื่อสร้างวัตถุที่ต้องการจากโรงงาน? ฉันรู้ว่าการติดตามตัวจัดการวัตถุและ / หรือรหัสคำสั่งทุกอย่างจะเปิดเผยสิ่งนี้ แต่ฉันหวังว่าจะหลีกเลี่ยงการเดินทางที่ยาวนานและลำบาก

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

2
Magento 2: พารามิเตอร์ตัวสร้าง $ data array คืออะไร?
ดังนั้นผมสังเกตเห็นว่าในรูปแบบมากที่สุดและบล็อกมีนี้array $data = []ให้เป็นพารามิเตอร์สุดท้ายของการสร้าง ตัวอย่างเช่น \Magento\Catalog\Block\Product\ListProduct public function __construct( \Magento\Catalog\Block\Product\Context $context, \Magento\Framework\Data\Helper\PostHelper $postDataHelper, \Magento\Catalog\Model\Layer\Resolver $layerResolver, CategoryRepositoryInterface $categoryRepository, \Magento\Framework\Url\Helper\Data $urlHelper, array $data = [] ) { $this->_catalogLayer = $layerResolver->get(); $this->_postDataHelper = $postDataHelper; $this->categoryRepository = $categoryRepository; $this->urlHelper = $urlHelper; parent::__construct( $context, $data ); } ฉันยังรู้ว่าเมื่อต้องรับมือกับการกำหนดลักษณะคุณยังต้องเก็บพารามิเตอร์นั้นไว้ท้ายรายการพารามิเตอร์คอนสตรัคเตอร์ของคุณเมื่อคุณเพิ่มพารามิเตอร์มากกว่าคอนสตรัคเตอร์ดั้งเดิม ดังนั้นฉันมีคำถามหลายข้อเกี่ยวกับอาร์เรย์นี้ : มันคืออะไร ? วิธีใช้งาน ทำไมเราต้องเก็บไว้ที่ท้ายรายการพารามิเตอร์คอนสตรัคเตอร์เมื่อประกาศการตั้งค่าสำหรับบล็อกที่เพิ่มพารามิเตอร์เพิ่มเติม

2
Magento 2 DI best practice
สมมติว่าฉันกำลังสร้างส่วนเสริม Magento 2 ที่ทำได้ .... ก็ดี ... ไม่สำคัญ สมมติว่ามันทำสิ่งที่ยอดเยี่ยมที่สุด แต่ฉันต้องการตรวจสอบให้แน่ใจว่านี่คือการสร้างโดยใช้มาตรฐานที่เหมาะสมเพื่อให้นักพัฒนารายอื่นสามารถขยายได้ เมื่อใดที่ฉันควรใช้ DI ร่วมกับส่วนต่อประสานและเมื่อใดที่ฉันไม่ควรใช้ เพื่อให้ชัดเจนนี่คือตัวอย่างหลัก ชั้นเรียนMagento\Core\Helper\Dataมีตัวสร้างเช่นนี้: public function __construct( \Magento\Framework\App\Helper\Context $context, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Framework\App\State $appState, PriceCurrencyInterface $priceCurrency, $dbCompatibleMode = true ) { parent::__construct($context); $this->_scopeConfig = $scopeConfig; $this->_storeManager = $storeManager; $this->_appState = $appState; $this->_dbCompatibleMode = $dbCompatibleMode; $this->_priceCurrency = $priceCurrency; } …

4
Magento 2: คำอธิบายการใช้งานจริงของคลาส proxy คืออะไร?
ดังนั้นฉันจึงรู้ทางทฤษฎีว่าคลาสพร็อกซีใน Magento 2 คืออะไรฉันได้อ่านบทความ Alan Storm ที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้และฉันเข้าใจว่าการเรียนเหล่านั้นเกิดขึ้นได้อย่างไร อย่างไรก็ตามและฉันไม่รู้ว่าเป็นเพราะฉันไม่ใช่เจ้าของภาษาอังกฤษหรือคำอธิบายของอลันกำลังใช้ชั้นเรียนที่ไม่ใช่แกนหลักซึ่งเป็นนามธรรมมาก แต่ฉันมีเวลายากที่จะเข้าใจว่ามันใช้งานได้อย่างไรและพิเศษเมื่อใช้ ระหว่างการพัฒนา ลองทำตัวอย่างจากแกนในapp/code/Magento/GoogleAdwords/etc/di.xml: <?xml version="1.0"?> <!-- /** * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\GoogleAdwords\Observer\SetConversionValueObserver"> <arguments> <argument name="collection" xsi:type="object">Magento\Sales\Model\ResourceModel\Order\Collection\Proxy</argument> </arguments> </type> </config> ผมอยากจะรู้ว่า: เหตุใดจึงใช้คลาสพร็อกซีในกรณีพิเศษนั้น โดยทั่วไปเมื่อใดควรใช้คลาสพร็อกซี

3
การเพิ่มวิธีการใหม่ให้กับคลาสนามธรรมใน Magento 2
เช่นเดียวกับหัวข้อนี้กล่าวว่าแทนที่ระดับนามธรรมในวีโอไอพี 2ในวีโอไอพี 1 , ฉันสามารถสร้างคลาสใหม่ได้อย่างสมบูรณ์ ใน Magento 2 เราจำเป็นต้องใช้ปลั๊กอิน แต่ปลั๊กอินอนุญาตให้ฉันแก้ไขวิธีที่มีอยู่เท่านั้น ฉันต้องทำอย่างไรหากฉันต้องการเพิ่มวิธีการใหม่ ตัวอย่าง: คลาสนี้vendor/magento/module-ui/Component/AbstractComponent.phpมีอาร์เรย์ของส่วนประกอบ: $componentsไม่มีฟังก์ชั่นในการยกเลิกการตั้งค่า / ลบองค์ประกอบสำหรับอาร์เรย์นั้น ดังนั้นฉันจะสร้างฟังก์ชันนั้นได้อย่างไร

1
DI & ขยายบล็อกบน Magento 2
ฉันดูเหมือนจะดิ้นรนที่จะเข้าใจการฉีดขึ้นกับบล็อกของ Magento 2 ทุกครั้งที่ฉันพยายามขยายบล็อกที่ไม่ใช่\ Magento \ Framework \ View \ Element \ Templateฉันท้ายด้วยข้อผิดพลาด ฉันต้องการสร้างบล็อกที่ขยายคลาสบล็อกพื้นฐานของMagento \ Theme \ Block \ Html \ Header \ Logo - ทุกอย่างทำงานได้ดีจนกระทั่งฉันลองใช้การฉีดพึ่งพาภายในวิธีการสร้าง: <?php namespace Creare\Test\Block\Header; class Logo extends \Magento\Theme\Block\Html\Header\Logo { protected $_creareHelper; public function __construct( \Magento\Framework\View\Element\Template\Context $context, \Creare\Seo\Helper\Data $creareHelper, array $data = [] ) { $this->_creareHelper …

2
วีโอไอพี 2: ใช้ข้อความเปรียบเทียบกับเส้นทางของคลาสโดยตรง?
ฉันอาจจะพลาดจุดหนึ่ง แต่ฉันแค่สงสัยว่าทำไมบางครั้งมีคำสั่ง "ใช้" สำหรับชั้นเรียนที่เฉพาะเจาะจงและบางครั้งเราไม่ ตัวอย่าง: app\code\Magento\Email\Model\Template.phpเรามีที่ด้านบนของไฟล์: namespace Magento\Email\Model; use Magento\Store\Model\ScopeInterface; use Magento\Store\Model\StoreManagerInterface; จากนั้นใน__constructวิธีการเรามีพารามิเตอร์ต่อไปนี้: public function __construct( \Magento\Framework\Model\Context $context, \Magento\Framework\View\DesignInterface $design, \Magento\Framework\Registry $registry, \Magento\Store\Model\App\Emulation $appEmulation, StoreManagerInterface $storeManager, \Magento\Framework\View\Asset\Repository $assetRepo, \Magento\Framework\Filesystem $filesystem, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\Email\Model\Template\Config $emailConfig, \Magento\Email\Model\TemplateFactory $templateFactory, \Magento\Framework\Filter\FilterManager $filterManager, \Magento\Framework\UrlInterface $urlModel, \Magento\Email\Model\Template\FilterFactory $filterFactory, array $data = [] ) ดังนั้นเราจะเห็นได้อย่างชัดเจนว่าเมื่อเราเรียกuse Magento\Store\Model\StoreManagerInterface;ที่ด้านบนของชั้นเรียนเราสามารถทำได้StoreManagerInterface $storeManagerในพารามิเตอร์ตัวสร้าง …

3
วิธีการแทนที่คลาส Virtual Type ใน Magento 2
วิธีการแทนที่ VirtualType block ใน Magento 2 ฉันต้องการแทนที่การบล็อกเสมือนจริงด้วยบล็อกของฉันเอง <virtualType name="Magento\CatalogSearch\Block\SearchResult\ListProduct" type="Magento\Catalog\Block\Product\ListProduct"> <arguments> <argument name="catalogLayer" xsi:type="object">Magento\Catalog\Model\Layer\Search</argument> </arguments> </virtualType> ดังนั้นฉันจึงพยายามแทนที่มันจากโมดูลที่กำหนดเองของฉันdi.xmlเช่นนี้ <preference for="Magento\Catalog\Block\Product\ListProduct" type="My\Vendor\Block\Product\ListProductSearch" /> แต่มันไม่ทำงาน ดังนั้นวิธีที่เหมาะสมในการเอาชนะคลาสชนิดเสมือนใน Magento 2 คืออะไร

5
ทำไมฉันไม่สามารถฉีด ProductRepositoryInterface ใน Magento 2 ได้?
ฉันมีการดำเนินการควบคุมที่ฉันต้องการฉีดที่เก็บสินค้า namespace Nosto\Tagging\Controller\Export; use Magento\Catalog\Api\ProductRepositoryInterface; use Magento\Store\Model\StoreManagerInterface; use Magento\Backend\App\Action; use Magento\Framework\App\Action\Context; class Test extends Action { private $_productRepository; public function __construct( Context $context, StoreManagerInterface $storeManager, ProductRepositoryInterface $productRepository ) { parent::__construct($context); $this->_storeManager = $storeManager; $this->_productRepository = $productRepository; } ไม่ว่าฉันจะสั่งคำสั่งคอนสตรัคเตอร์ของฉันแบบใดก็ตามวีโอไอพีของการพึ่งพาการฉีดมักจะเป็นชั้นที่ไม่ถูกต้องสำหรับการproductRepositoryโต้แย้งที่นำ PHP ไปโยนและข้อผิดพลาดการโต้แย้ง storeManagergetd ฉีดเพียงแค่ปรับ การล้างแคชไม่ได้ช่วย นี่คือข้อยกเว้นโยน: Recoverable Error: Argument 3 passed to …

3
การฉีดการพึ่งพาในรูปแบบวีโอไอพี CRUD / บทคัดย่อ
เป็นไปได้หรือไม่ที่จะฉีดการพึ่งพาลงในโมเดล 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 …

2
ทำไมบางคลาสถึงกำหนด injections ในทั้งนวกรรมิกและ di.xml
ฉันไม่เข้าใจว่าทำไมในบางคลาสการประกาศการพึ่งพาของพวกเขาจึงถูกประกาศสองครั้ง - หนึ่งครั้งในdi.xmlและในคอนสตรัคเตอร์ของคลาสคอนกรีต ตัวอย่างเช่นในMagento\Backend\Model\Url, มันdi.xmlมีชุดประเภทนี้สำหรับการกำหนด DI: <type name="Magento\Backend\Model\Url"> <arguments> <argument name="scopeResolver" xsi:type="object"> Magento\Backend\Model\Url\ScopeResolver</argument> <argument name="authSession" xsi:type="object"> Magento\Backend\Model\Auth\Session\Proxy</argument> <argument name="formKey" xsi:type="object"> Magento\Framework\Data\Form\FormKey\Proxy</argument> <argument name="scopeType" xsi:type="const"> Magento\Store\Model\ScopeInterface::SCOPE_STORE </argument> <argument name="backendHelper" xsi:type="object"> Magento\Backend\Helper\Data\Proxy</argument> </arguments> </type> แต่ในเวลาเดียวกันในคลาสที่เป็นรูปธรรมคลาสเหล่านั้นที่กำหนดใน di.xml ที่จำเป็นสำหรับการฉีดจะถูกประกาศอีกครั้งใน Constructor: <?php public function __construct( \Magento\Framework\App\Route\ConfigInterface $routeConfig, \Magento\Framework\App\RequestInterface $request, \Magento\Framework\Url\SecurityInfoInterface $urlSecurityInfo, \Magento\Framework\Url\ScopeResolverInterface $scopeResolver, \Magento\Framework\Session\Generic $session, …

2
ฉันจะเพิ่มหมายเลขติดตามในการจัดส่งคำสั่งซื้อปัจจุบันใน Magento 2 ได้อย่างไร
ฉันหาโค้ดตัวอย่างสำหรับ Magento 1.x แต่ฉันไม่รู้ว่าจะทำอย่างไรกับ Magento 2 ทุกคนสามารถอธิบายวิธีการใช้สิ่งนี้โดยใช้การฉีดพึ่งพา (DI) ? ขอบคุณ $trackingDetail = array( 'carrier_code' => 'ups', 'title' => 'United Parcel Service', 'number' => 'TORD23254WERZXd3', // Replace with your tracking number ); $track = Mage::getModel('sales/order_shipment_track')->addData($trackingDetail); $shipment->addTrack($track); $transactionSave = Mage::getModel('core/resource_transaction') ->addObject($shipment) ->addObject($shipment->getOrder()) ->save();

1
Magento 2: Convention Type Naming Type
วันที่: 1 มิถุนายน 2558 (เปลี่ยนจาก Magento 2) ใน Magento 2 คุณสามารถกำหนดค่า "ชนิดเสมือน"ในdi.xmlไฟล์กำหนดค่าของโมดูล ชนิดเสมือนเหล่านี้ช่วยให้คุณสามารถเปลี่ยนอาร์กิวเมนต์ของการพึ่งพาการฉีดเฉพาะ ในรหัสหลักของวีโอไอพี 2 ดูเหมือนว่าจะมีสองแบบแผนการตั้งชื่อสำหรับประเภทเสมือน ในครั้งแรกประเภทเสมือนมีชื่อที่ดูเหมือนกับชื่อคลาส PHP จริง #File: app/code/Magento/CatalogRule/etc/di.xml <virtualType name="Magento\Catalog\Pricing\Price\Pool" ... ในครั้งที่สองจะใช้สตริงที่เรียบง่ายและไม่ใช้แบ็กสแลช #File: app/code/Magento/CatalogSearch/etc/di.xml <virtualType name="advancedSearchFilterList" ... มีความแตกต่างในทางปฏิบัติในการประชุมการตั้งชื่อทั้งสองข้างต้นหรือไม่? นั่นคือชื่อที่คุณเลือกให้virtualTypeมีผลกระทบกับพฤติกรรมของมันหรือเป็นเพียงสตริงที่ไม่ซ้ำกันทั่วโลกที่ระบุประเภทเพื่อให้คุณสามารถใช้ในภายหลัง

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