Question

Je suis en train d'injecter un CollectionFactory objet dans un Plugin comme ceci:

/**
 * PopulateCustomerCards constructor.
 * @param CardCollectionFactory $cardCollectionFactory
 */
public function __construct(
    CardCollectionFactory $cardCollectionFactory
) {
    $this->cardCollectionFactory = $cardCollectionFactory;
}

J'ai aussi créer la Collection de la classe comme ceci:

class Collection extends Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
    public function doSomething()
    {
        /* ... some magic is done here */
    }
}

Quand je lance l'installation:di:compiler le CardCollectionFactory est créé comme ceci:

/**
 * Factory class for @see \My\Module\Model\ResourceModel\Card\Collection
 */
class CollectionFactory
{
    /**
     * Object Manager instance
     *
     * @var \Magento\Framework\ObjectManagerInterface
     */
    protected $_objectManager = null;

    /**
     * Instance name to create
     *
     * @var string
     */
    protected $_instanceName = null;

    /**
     * Factory constructor
     *
     * @param \Magento\Framework\ObjectManagerInterface $objectManager
     * @param string $instanceName
     */
    public function __construct(\Magento\Framework\ObjectManagerInterface $objectManager, $instanceName = '\\My\\Module\\Model\\ResourceModel\\Card\\Collection')
    {
        $this->_objectManager = $objectManager;
        $this->_instanceName = $instanceName;
    }

    /**
     * Create class instance with specified parameters
     *
     * @param array $data
     * @return \My\Module\Model\ResourceModel\Card\Collection
     */
    public function create(array $data = array())
    {
        return $this->_objectManager->create($this->_instanceName, $data);
    }
}

Le problème est que lorsque j'exécute le code, fichier Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection les sauts à la ligne:

    $this->setConnection($this->getResource()->getConnection());

Parce que \Magento\Framework\DB\Adapter\AdapterInterface $connection = null n'est pas injecté dans le constructeur.

Était-ce utile?

La solution

Ressemble la collection n'est pas initialisé correctement.Il doit avoir des connaissances sur le modèle et le modèle de ressources.Ajoutez la méthode suivante à la classe de collection personnalisée:

protected function _construct()
{
    $this->_init('My\Module\Model\Card', 'My\Module\Model\ResourceModel\Card');
}

Autres conseils

Je suis peut-être hors de la base ici, mais une chose que vous devez rappel avec l'auto-générés usines est que je pense qu'ils ne fonctionnent que pour les classes où l'injection de dépendance peut fournir tous les arguments du constructeur.Par exemple, si vous avez besoin de créer des produits lorsque le constructeur exige un ID de produit, la valeur par défaut de l'usine ne fonctionne pas - la méthode create() doit être créer($productId).

Dans ce cas, la base abstraite de la classe de collection prend "connexion" comme un argument du constructeur, avec une valeur par défaut de 'null'.Voir https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Model/ResourceModel/Db/Collection/AbstractCollection.php#L116

Je me demande si le problème est la connexion n'est pas fourni et doit, ou la di.xml le programme d'installation pour quelque raison n'est pas de fournir la connexion (je ne suis pas familier avec ce niveau de code - donc, juste en essayant de fournir une indication, pas une solution complète).

Mais c'est quelque chose à surveiller.Il ressemble à la connexion doit être fournie, mais ne l'est pas.(Une autre raison possible est le type d'argument de l'abrégé de la collection ne correspond pas à la di.xml fichier.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top