Magento 2 Class * Factory n'existe pas

15

J'essayais d'installer un plugin et j'ai supprimé var / generation et var / cache / *. J'ai vérifié le MAGE_MODE et je suis développeur, mais maintenant, quand j'accède au front-end et à l'administrateur, je reçois des erreurs aléatoires disant des choses méchantes comme: Class Magento\Customer\Model\CustomerFactory does not exist

La classe Magento \ Sales \ Model \ ResourceModel \ Report \ OrderFactory n'existe pas

Certaines classes sont en cours de création, mais pas toutes. J'ai essayé à nouveau d'effacer le cache et le dossier de génération, mais je reçois juste les mêmes erreurs.

Des idées?

jstrez77
la source
1
vérifier les droits sur le dossier var / generation
Marius
il dit drwxrwxrw- 5
jstrez77
J'ai dû nettoyer le dossier var / generation plusieurs fois, aller d'abord à la page d'accueil, nettoyer, puis admin, puis me connecter, puis nettoyer ... et cela a fonctionné ... ?? Je ne comprends pas
jstrez77
Certainement des autorisations dans le dossier 'var / generation'.
Travis van der Font

Réponses:

21

Magento 2 génère des classes Factory dans le var/generationrépertoire. Donc, s'il y a un problème d'autorisation de dossier ou un problème de propriétaire de dossier avec ce répertoire, la classe d'usine ne peut pas être générée et vous obtenez une telle erreur.

Lorsque vous effacez le var/generationrépertoire et lui attribuez les autorisations appropriées, cette erreur doit être résolue.

En savoir plus sur la génération de code dans Magento 2

Mukesh Chapagain
la source
Peut être également var/diou var/cache, voir devdocs.magento.com/guides/v2.2/install-gde/trouble/…
Yvan
10

Pour moi, j'ai supprimé le var/generationdossier puis j'ai exécuté magento setup:di:compilece qui a généré toutes les classes nécessaires.

(dans mon cas: j'ai rencontré un problème de cache, j'ai supprimé le dossier de cache initial.)

Ensuite, cela a résolu mon problème. À votre santé !!

Suman KC
la source
1
besoin de changer le propriétaire des fichiers à la fin
moshe beeri
5

Dans magento, les nouvelles versions comme 2.2.2 et au-dessus de ce chemin de génération de code sont devenues

<Magento root folder>/generated

vous devez donc également vérifier les autorisations pour ce dossier. Vous devez exécuter la commande suivante à la racine du répertoire d'installation de Magento pour résoudre ce problème:

sudo chmod -R 777 generated/
Hassan Ali Shahzad
la source
vider le cache aussi au début
Hassan Ali Shahzad
son travail pour moi
matinict
1

Les commandes suivantes doivent être exécutées:

sudo php -f bin/magento setup:di:compile 

sudo rm -rf pub/static/*/*; sudo rm -rf var/*/*; 
sudo php -f bin/magento setup:static-content:deploy -f  

sudo php bin/magento cache:clean

En outre, une autorisation appropriée est nécessaire. Si en production, vous devez exécuter les autorisations appropriées. Mais, sur la machine locale, vous pouvez exécuter une autorisation complète:

sudo chmod -R 777 *
Agilox
la source
1

Accordez l'autorisation 777 et changez la propriété en www-data du dossier généré / code , puis exécutez la commande sudo php bin/magento setup:di:compilevider le cache et boom votre problème est résolu

Mohammed Muzammil
la source
1

C'est juste un <magento-root>/var/problème d'autorisation de dossier.

Exécuter la commande ci-dessous en utilisant le mode CLI

sudo chmod -R 777 var/
Anwar
la source
0

Magento 2 crée les classes d'usine dans le var/generationdossier et si vous ajoutez un nouveau paramètre dans votre __construct()et que sa classe d'usine n'existe pas, Magento 2 lance le message d'erreur ci-dessus. Même s'il existe déjà peu de solutions à vous poser, je peux vous proposer une autre solution qui ne vous oblige pas à vider votre dossier de génération. Veuillez utiliser la commande ci-dessous après toute modification relative aux classes Factory:

bin/magento setup:di:compile

Cette commande peut être plus utile sur le serveur de production.

Sourabh Kumar Sharma
la source
-2

Classe ... L'usine n'existe pas signifie que votre classe de modèle n'est pas chargée. Comme Magento 2 basé sur une programmation modulaire, nous devons donc spécifier la classe de modèle où nous voulons utiliser explicitement. Nous pouvons utiliser notre classe de modèle en deux types:

1.par "utiliser"

use Magento\Customer\Setup\CustomerSetupFactory;

public function __construct(CustomerSetupFactory $customerSetupFactory)
{
    $this->customerSetupFactory = $customerSetupFactory;
}
  1. Directement

    public function __construct(Magento\Customer\Setup\CustomerSetupFactory $customerSetupFactory){
    
    $this->customerSetupFactory = $customerSetupFactory;
    
    }

Lorsque vous frappez l'URL ( http://domain.com/your module frontname) de votre plugin sur le navigateur, Magento génère le code de votre module comme ci-dessous:

\var\generation\Your Vendor Directory\Your Module Directory\Controller
\var\generation\Your Vendor Directory\Your Module Directory\Model

Dans votre cas, vous devez vérifier que "CustomerFactory" et "OrderFactory" sont utilisés comme format ci-dessus ou non.

Suman Singh
la source