web-dev-qa-db-fra.com

Le chargement automatique de la carte de classe Composer ne charge pas les nouveaux fichiers dans le dossier

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?

18
pyxl

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.

20
Sven

Allez à la racine de votre serveur par SSH. Maintenant, faites ce qui suit:

  1. Exécutez ls pour répertorier tous les fichiers.
  2. Vous verrez le fichier composer.lock; supprimez le fichier avec la commande rm composer.lock.
  3. Maintenant, lancez la commande 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:

  1. Exécutez la commande composer dump-autoload.
6

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.

0
David Stone