Tại sao tôi không thể tiêm ProductRep repositoryInterface trong Magento 2?


12

Tôi có một hành động điều khiển mà tôi muốn tiêm kho lưu trữ sản phẩm

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;
    }

Bất kể thứ tự nào tôi đặt các đối số hàm tạo của mình, phép tiêm phụ thuộc của Magento luôn tiêm một lớp không hợp lệ cho productRepositoryđối số khiến PHP ném và lỗi đối số. Các storeManagergetd tiêm tốt. Xóa bộ nhớ cache không giúp được gì.

Đây là ngoại lệ được ném:

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.

Tên lớp và vị trí đối số trong thông báo lỗi thay đổi nhưng định nghĩa lỗi luôn giống nhau. Loại bỏ ProductRepositoryInterfacekhỏi hàm tạo làm cho mọi thứ trở lại tốt đẹp.


Re: "Tiêm phụ thuộc của Magento luôn tiêm một lớp không hợp lệ cho đối số ProductRep repository" Bao gồm lỗi chính xác sẽ giúp người khác chẩn đoán sự cố.
Alan Storm

1
Bạn đã xóa var / thế hệ?
Marius

@AlanStorm. Xin lỗi vì điều đó. Tôi đã chỉnh sửa câu hỏi.
Mridang Agarwalla

Câu trả lời:


18

Điều này thường tăng lên khi bạn thêm một tham số khác vào hàm tạo vì Magento lưu trữ nó trong var / thế hệ. Bạn cần xóa var / thế hệ buộc Magento phải tạo lại bộ chặn.


Có vẻ như bạn đã đúng. Tôi đã xóa bộ nhớ cache từ quản trị viên và điều đó không giúp được gì.
Mridang Agarwalla

2
Có vẻ như trong cài đặt mới, thư mục đã tạo nằm trong cấu trúc thư mục gốc không phải là var, có thể giúp
xelber

Tôi đã tạo một mô-đun tùy chỉnh và thử mã này bên trong lớp Custom \ Module \ MagentoU \ Test; 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

Đã thử mọi thứ vẫn nhận được cùng một lỗi Đối số 4 được truyền cho Custom \ Module \ MagentoU \ Test :: __ construc () phải là một phiên bản của Custom \ Module \ Api \ ProductRep repositoryInterface, ví dụ của Magento \ Catalog \ Model \ ProductRepousing \ Interceptor đưa ra
Ashwani Shukla

Chạy php bin/magento setup:upgradetheo nó
Đen

4

Thật khó để nói mà không có thêm thông tin chi tiết, nhưng tôi sẽ giả sử mẫu mã của bạn thực sự trông giống như thế này

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;
    }
}

tức là với một không gian tên PHP (vì tất cả các bộ điều khiển đều có không gian tên trong Magento 2).

Nếu đó là trường hợp, thì trong mẫu mã của bạn, bạn thực sự đang cố gắng tiêm một Packagename\Module\Controller\ProductRepositoryInterfacelớp. Nếu bạn sử dụng tên lớp không có tiền tố không gian tên, PHP giả định rằng bạn muốn có một lớp trong không gian tên hiện tại .


4

Tôi không thể đưa bất kỳ mô-đun nào vào bộ điều khiển có thông báo lỗi này. Xóa var / thế hệ làm việc cho tôi ..


2

Những gì làm việc cho tôi là chạy lệnh biên dịch.

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

0

Trong thư mục xóa magento 2.2:

"generated/code"

Và điều đó sẽ giải quyết vấn đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.