Magento 2에 ProductRepositoryInterface를 삽입 할 수없는 이유는 무엇입니까?


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

생성자 인수를 넣은 순서에 관계없이 Magento의 의존성 주입은 항상 productRepositoryPHP를 던지고 인수 오류를 일으키는 인수에 대해 유효하지 않은 클래스를 주입합니다 . 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 : "Magento의 의존성 주입은 항상 productRepository 인수에 대해 유효하지 않은 클래스를 주입합니다"정확한 오류를 포함하면 다른 사람들이 문제를 진단하는 데 도움이됩니다.
Alan Storm

1
var / generation을 지우셨습니까?
Marius

@AlanStorm. 미안합니다. 질문을 편집했습니다.
Mridang Agarwalla

답변:


18

Magento가 변수를 var / generation으로 캐시하기 때문에 생성자에 다른 매개 변수를 추가하면 일반적으로 잘립니다. Magento가 인터셉터를 재생성하도록 var / generation을 지워야 합니다.


당신이 옳은 것 같습니다. 관리자로부터 캐시를 지우고 있지만 도움이되지 않았습니다.
Mridang Agarwalla

2
새 설치처럼 보이는, 생성 된 폴더는하지 VAR의 루트 폴더 구조에, 힘 도움말
xelber

사용자 정의 모듈을 만들고 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

시도 모든 여전히 같은 오류지고 구조가 () 사용자 정의 \ 모듈 \ API 광고 \ ProductRepositoryInterface, 마 젠토 \ 카탈로그의 인스턴스의 인스턴스 일 필요가 \ 모델 \ ProductRepository \ 인터셉터가 주어진 :: __ 사용자 \ 모듈 \ MagentoU \ 테스트에 전달 된 인수 4
Ashwani을 Shukla

php bin/magento setup:upgrade후 실행
블랙

4

더 자세한 내용없이 말하기는 어렵지만 코드 샘플이 실제로 다음과 같다고 가정 합니다.

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

즉, 모든 네임 스페이스에는 Magento 2에 네임 스페이스가 있으므로 PHP 네임 스페이스를 사용합니다.

이 경우 코드 샘플에서 실제로 Packagename\Module\Controller\ProductRepositoryInterface클래스 를 주입하려고합니다 . 네임 스페이스 접두사가없는 클래스 이름을 사용하는 경우, PHP는 현재 네임 스페이스에 클래스를 원한다고 가정합니다 .


4

이 오류 메시지와 함께 모듈을 컨트롤러에 주입 할 수 없습니다. var / generation을 삭제하면 나를 위해 일했습니다 ..


2

나를 위해 일한 것은 컴파일 명령을 실행하는 것입니다.

/ var / www / magento2-root $ PHP bin / magento setup : di : 컴파일

0

magento 2.2에서 폴더 삭제 :

"generated/code"

그러면 문제가 해결됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.