Comment définir le chemin d'accès à autoload.php avec le compositeur
-
21-12-2019 - |
Question
J'ai un compositeur de projet, de l'appeler MyVendor\Database
.Ce projet utilise le compositeur et le chargement automatique.Il y a plusieurs fichiers dans ce projet:
require_once __DIR__."/../vendor/autoload.php";
afin d'utiliser l'auto-chargement.
Tout fonctionne très bien, jusqu'à ce que je comprend MyVendor\Database
dans un autre projet.
J'ai un autre projet, de l'appeler MyVendor\CoolPackage
qui nécessite MyVendor\Database
.
- Je exécuter compositeur installer sur CoolPackage
et elle se télécharge MyVendor\Database
dans le fournisseur de dossier.
Le problème, ici, est à Mes fichiers à l'intérieur vendor\MyVendor\Database
l'échec parce qu'ils appel require_once __DIR__."/../vendor/autoload.php"
, mais il n'y a pas de vendeur dossier à l'intérieur de \vendor\MyVendor\Database
.
La solution
Dans votre composer.json
vous définissez le chargement automatique de régime.Pour des raisons que vous trouvez vous-même maintenant, il n'est pas une bonne idée d'appeler le Compositeur d'auto-chargement à l'intérieur de tous les fichiers qui sont censés être autoloadable non seulement à l'intérieur de l'application ou d'un module, mais dans toute autre application.
Fondamentalement, les fichiers de n'importe quel Compositeur de projet doit être divisée en fonction de la définition du PSR-0 ou 4 auto-chargement:Soit ils SEULEMENT faire la déclaration de classes ou de fonctions, SANS effets secondaires (comme l'exécution de code), ou d'exécuter du code sans la définition des classes ou des fonctions.Seuls les anciens fichiers peuvent être chargés automatiquement (à l'exception des fonctions, qui ne serait en mesure de toujours être déclarée par le chargement d'un fichier contenant avec un files
chargement automatique de la section), le second ne devrait PAS être chargé.
Et puis, il devrait être relativement facile:Toutes les classes qui peuvent être chargées automatiquement peut également être utilisé lorsque ce composant est inclus dans une autre application.Autre chose qui n'est pas une classe ne peut pas être utilisé directement.