ทำไมฉันไม่สามารถฉีด ProductRepositoryInterface ใน Magento 2 ได้?


12

ฉันมีการดำเนินการควบคุมที่ฉันต้องการฉีดที่เก็บสินค้า

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 Nosto\Tagging\Controller\Export\Test::__construct() must implement interface Magento\Catalog\Api\ProductRepositoryInterface, instance of Nosto\Tagging\Helper\Account given.

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


Re: "การพึ่งพาการฉีดของวีโอไอพีจะทำการฉีดคลาสที่ไม่ถูกต้องสำหรับอาร์กิวเมนต์การเก็บข้อมูลผลิตภัณฑ์เสมอ" การรวมข้อผิดพลาดที่แน่นอนจะช่วยให้ผู้อื่นสามารถวินิจฉัยปัญหาได้
Alan Storm

1
คุณล้าง var / generation หรือไม่?
Marius

@AlanStorm ขอโทษสำหรับเรื่องนั้น. ฉันแก้ไขคำถามแล้ว
Mridang Agarwalla

คำตอบ:


18

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


ดูเหมือนว่าคุณพูดถูก ฉันล้างแคชจากผู้ดูแลระบบแล้วและก็ไม่ได้ช่วยอะไร
Mridang Agarwalla

2
ดูเหมือนว่าในการติดตั้งใหม่โฟลเดอร์ที่สร้างขึ้นอยู่ในโครงสร้างโฟลเดอร์รูทที่ไม่ได้อยู่ใน var อาจช่วยได้
xelber

ฉันได้สร้างโมดูลที่กำหนดเองและลองใช้รหัสนี้ใน Custom \ Module \ MagentoU \ Test class; public function __construct( \Magento\Catalog\Api\ProductRepositoryInterface $productRepository, \Magento\Catalog\Model\ProductFactory $productFactory, \Magento\Checkout\Model\Session $session, \Custom\Module\Api\ProductRepositoryInterface $unit1ProductRepository, array $data, $justAParameter = "" ) <preference for="Custom\Module\Api\ProductRepositoryInterface" type="Magento\Catalog\Model\ProductRepository" />
Ashwani Shukla

ทุกสิ่งที่พยายามยังคงได้รับข้อผิดพลาดอาร์กิวเมนต์ที่ 4 ผ่านไปยัง Custom \ Module \ MagentoU \ Test :: __ construct () ต้องเป็นตัวอย่างของ Custom \ Module \ Api \ ProductRepositoryInterface อินสแตนซ์ของ Magento \ Catalog \ Model \ ProductRepository \ Interceptor ที่กำหนด
Ashwani Shukla

เรียกใช้php bin/magento setup:upgradeหลังจากนั้น
Black

4

มันยากที่จะพูดได้โดยไม่รายละเอียดเพิ่มเติม แต่ฉันจะสมมติตัวอย่างรหัส youe จริงมีลักษณะบางอย่างเช่นนี้

namespace Packagename\Module\Controller;
class Test extends Action
{

    private $_productRepository;

    public function __construct(
        Context $context,
        StoreManagerInterface $storeManager,
        ProductRepositoryInterface $productRepository    
    ) {
        parent::__construct($context);
        $this->_storeManager = $storeManager;
        $this->_productRepository = $productRepository;
    }
}

เช่นกับ namespace PHP (เนื่องจากตัวควบคุมทั้งหมดมี namespaces ใน Magento 2)

หากเป็นเช่นนั้นในตัวอย่างโค้ดของคุณคุณกำลังพยายามฉีดPackagename\Module\Controller\ProductRepositoryInterfaceคลาส ถ้าคุณใช้ชื่อคลาสที่ไม่มีคำนำหน้าเนมสเปซ PHP จะถือว่าคุณต้องการคลาสในเนมสเปซ ปัจจุบัน


4

ฉันไม่สามารถฉีดโมดูลใด ๆ ไปยังคอนโทรลเลอร์ด้วยข้อความแสดงข้อผิดพลาดนี้ การลบ var / generation ใช้งานได้สำหรับฉัน ..


2

สิ่งที่ใช้ได้ผลสำหรับฉันกำลังเรียกใช้คำสั่งการคอมไพล์

/ var / www / magento2-root $ php bin / magento setup: di: compile

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