Le problème suivant: J'ai défini un classmap dans mon composer.json:
"autoload": {
"classmap": [
"app/controllers",
"app/models",
"app/helper.php"
]
}
Cependant, lorsque je crée un nouveau fichier dans le dossier "controllers" ou "models", il ne les charge pas et je dois toujours créer un composeur dump-autoload.
Est-ce le comportement correct? Je pensais alors que l'autoloader de compositeur surveille le dossier à la recherche de nouveaux fichiers?
Oui, c'est un comportement correct. Si vous souhaitez que les nouvelles classes soient chargées automatiquement, vous devez utiliser le chargement automatique du PSR-0 ou du PSR-4.
Pour générer la classmap, Composer doit connaître le nom du fichier contenant une classe donnée. Cela ne peut être fait qu'en analysant tout le code source de l'annuaire et en recherchant les classes, les interfaces et les définitions de traits.
Il s’agit généralement d’une tâche intensive du processeur et des E/S. Elle ne s’effectue donc que lorsque Composer installe/met à jour ou (à la demande) vide l’autochargeur, mais pas à chaque require "vendor/autoload.php";
.
Notez que le chargement automatique de la classmap est simplement là pour les anciennes bases de code héritées qui n’implémentaient pas au moins PSR-0. Il n'est pas destiné à un nouveau code - à moins que vous ne vouliez payer le prix pour vider l'autoloader encore et encore pendant le développement.
Allez à la racine de votre serveur par SSH. Maintenant, faites ce qui suit:
ls
pour répertorier tous les fichiers.composer.lock
; supprimez le fichier avec la commande rm composer.lock
.php composer update
. Selon votre type de Linux, vous devrez peut-être exécuter php-cli composer update
.
L'étape 3 créera un nouveau fichier composer.lock
et toutes vos classes seront chargées à nouveau. Faites-le chaque fois que vous ajoutez de nouvelles classes.
ou:
composer dump-autoload
.Comme déjà indiqué, il s’agit d’un comportement correct. Si vous souhaitez que les nouvelles classes soient chargées automatiquement, vous devez utiliser le chargement automatique du PSR-0 ou du PSR-4.
Le type de chargement automatique de classmap spécifié est composer.json est principalement utilisé par les projets hérités qui ne suivent pas PSR-0 ou PSR-4. J'ai récemment commencé à travailler sur un tel projet et je voulais essayer d'exécuter automatiquement la commande composer dump-autoload
quand une nouvelle classe est créée. C'est en fait difficile sans inclure toutes les sources du compositeur dans le projet. Je suis venu avec cela juste pour rappeler au développeur qu'ils ont besoin de vider la classmap:
$loader = include_once 'vendor/autoload.php';
if ( ! $loader ) {
throw new Exception( 'vendor/autoload.php missing please run `composer install`' );
}
spl_autoload_register(
function ( $class ) {
if ( 'A_Common_Class_Prefix' === substr( $class, 0, 10 ) ) {
throw new Error( 'Class "' . $class . '"" not found please run `composer dump-autoload`' );
}
},
true
);
Cela enregistre un autre chargeur automatique qui est exécuté après le chargeur automatique du compositeur afin que toutes les classes que le compositeur n'a pas trouvées lui soient transmises. Si la classe correspond à un préfixe, une exception est demandée rappelant au développeur de re-dump l’autochargeur et de mettre à jour la mappe de classes.