2017-07-07 1 views
6

Je travaille actuellement sur un projet Laravel qui doit accéder à des classes à partir de son répertoire parent.Composition automatique du compositeur - charger la classe depuis le répertoire parent

composer.json> PSR-4:

"psr-4": { 
     ... 
     "ModuleA\\": "../ModuleA/baseObjects", 
     "ModuleB\\": "../ModuleB/baseObjects" 
    } 

Exemple de structure de fichier:

/var/www 
+- /xxx (project) 
    +- /ModuleA 
     +- /baseObjects 
      - configClass.inc 
    +- /ModuleB 
     +- /baseObjects 
      - configClass.inc 
    +- /laravel 
     - composer.json 

je lance composer dump-autoload mais le projet ne trouve toujours pas ModuleA\configClass ni ModuleB\configClass.

En outre, à l'intérieur de mon autoload_psr4.php, le document de référence obtient comme suit:

'MobuleA\\' => array($baseDir . '/../MobuleA/baseObjects') 
'MobuleB\\' => array($baseDir . '/../MobuleB/baseObjects') 

Merci à l'avance.

+0

essayer "": "src (dossier principal je suppose que son) /" pas besoin d'initialiser les modules seulement ajouter un dossier et/ – DaAmidza

Répondre

0

essayer:

"psr-4": { 
     ... 
     "ModuleA\\": "ModuleA/baseObjects", 
     "ModuleB\\": "ModuleB/baseObjects" 
} 
+0

Cela ne fonctionne pas, le code ci-dessus tente de le trouver dans le répertoire en cours, j'essaie d'accéder au répertoire parent. – dzerow

0

Selon cette answer vous pouvez l'ajouter dans le fichier index.php:

$loader = require 'vendor/autoload.php'; 
$loader->add('Namespace\\Somewhere\\Else\\', __DIR__); 
$loader->add('Namespace\\Somewhere\\Else2\\', '/var/www/html/xxx'); 
4

PSR-4 exige que les fichiers chargés d'avoir une classe des espaces de noms, et la structure de l'espace de noms doit correspondre à la structure du répertoire, par rapport au "répertoire de base" défini dans la configuration (http://www.php-fig.org/psr/psr-4/).

Ainsi, dans le fichier /var/xxx/ModuleA/baseObjects/configClass.inc devrait être la classe

namespace ModuleA\baseObjects; 

class configClass { 
    ... 
} 

Puis, en var/www/laravel/composer.json vous pourriez avoir

"psr-4": { 
     "App\\": "app/", 
     "ModuleA\\": "../ModuleA" 
    } 

Ce qui signifie: « répertoire ../ModuleA doit être la racine pour ModuleA espace de noms, puis suivez subnamespaces en faisant correspondre les sous-répertoires à partir de là ".

1

Le problème que vous rencontrez n'est pas lié aux répertoires parents. En fait, votre configuration Composer.json autoload est correcte pour votre structure de répertoire.

Le problème est l'extension de fichier .inc, incompatible avec la spécification PSR-4. Plus d'infos ici: How To Make Composer (PSR-4) To Work With ".class.php" Extension?

Si vous ne pouvez pas mettre à jour votre code source pour correspondre à la spécification PSR-4, vous pouvez utiliser Class Mapping:

Les références classmap sont tous réunis, lors de l'installation/mise à jour, en une seule key => tableau de valeur qui peut être trouvé dans le fichier généré vendor/composer/autoload_classmap.php. Cette carte est construite en recherchant des classes dans tous les fichiers .php et .inc dans les répertoires/fichiers donnés.

Vous pouvez utiliser la prise en charge de la génération de classes pour définir le chargement automatique pour toutes les bibliothèques qui ne suivent pas PSR-0/4. Pour configurer ceci, vous devez spécifier tous les répertoires ou fichiers pour rechercher des classes.

Alors votre config pourrait ressembler à:

"autoload": { 
    "classmap": [ 
     "../ModuleA/baseObjects", 
     "../ModuleB/baseObjects" 
    ] 
} 

Rappelez-vous, si vous utilisez le mappage de classe, vous devez exécuter composer dump-autoload chaque fois que vous changez composer.json, ajoutez une classe, modifier une classe nom/nom/chemin, etc.

supplémentaire: comme l'a souligné @alepeino, en utilisant autoloader optimization va générer une carte de classe de tout PSR-0 et PSR-4 définitions autoload, en utilisant le même code sous-jacent qui classmap autoload utilise. Cela vous "permettra" d'utiliser l'autoloader PSR-4 et l'extension .inc. Cela vous demandera toujours d'exécuter composer dump-autoload --optimize chaque fois que vous modifiez un fichier, tout comme le classmap.

Meilleure recommandation: changez votre code source pour suivre les spécifications du PSR-4 et utilisez l'extension .php.

Ensuite, mieux si vous ne pouvez pas faire cela: utilisez classmap pour l'auto-chargement. Utiliser le chargement automatique du classmap résoudra ce problème.

+0

Je pensais donc d'abord, donc je l'ai essayé, et j'ai trouvé que bien que la spécification PSR-4 indique que l'extension de fichier "DOIT" être ".php", le compositeur a effectivement chargé un ".inc" correctement. – alepeino

+0

J'aimerais voir le code que vous avez utilisé pour tester. J'ai fait une base PSR-4 mis en place correspondant à la structure du répertoire en question, puis changé l'une des extensions de classe en .inc et il ne pouvait plus être trouvé. Le [autochargeur définit explicitement l'extension] (https://github.com/composer/composer/blob/e42e1156d51ca5494b058b1a7b480bc703c4f57a/src/Composer/Autoload/ClassLoader.php#L351). Peut-être une différence dans la version Composer? –

+0

Il s'avère que j'ai fait mon premier test dans un projet Laravel, puis essayé à nouveau dans un nouveau projet ad-hoc et ne fonctionnerait pas. Mon original composer.json avait 'optimiser-autoloader' sur. Voir https://github.com/alepeino/composer-optimize – alepeino