web-dev-qa-db-fra.com

Utiliser le chargement automatique du compositeur

J'ai regardé autour du filet sans succès sur cette question. J'utilise l'autoload du compositeur avec ce code dans mon composer.json:

"autoload": {
    "psr-0": {"AppName": "src/"}
}

Mais je dois charger automatiquement à un niveau supérieur au dossier du fournisseur.

Faire quelque chose comme ça ne marche pas:

"autoload": {
    "psr-0": {"AppName": "../src/"}
}

Est-ce que quelqu'un connaît un correctif ou comment je peux le faire?

65
Chris R

Chaque paquet doit être responsable du chargement automatique lui-même. Que tentez-vous d'atteindre avec le chargement automatique de classes qui ne font pas partie du paquet que vous définissez?

Une solution de contournement s’applique si votre application elle-même consiste à ajouter un espace de nom à l’instance du chargeur, comme suit:

<?php

$loader = require 'vendor/autoload.php';
$loader->add('AppName', __DIR__.'/../src/');
69
Seldaek

Le documentation du compositeur indique que:

Après avoir ajouté le champ autoload, vous devez réexécuter l’installation pour générer à nouveau le fichier vendor/autoload.php.

En supposant que votre répertoire "src" se situe au même niveau que le répertoire "vendor":

  • src
    • Nom de l'application
  • vendeur
  • composer.json

la configuration suivante est absolument correcte:

{
    "autoload": {
        "psr-0": {"AppName": "src/"}
    }
}

mais vous devez réactualiser/installer les dépendances pour que cela fonctionne pour vous, c’est-à-dire, exécutez:

php composer.phar update

Cette commande récupérera les dernières versions des dépendances et mettra à jour le fichier "vendor/composer/autoload_namespaces.php" en fonction de votre configuration.

Comme noté par @Dom, vous pouvez aussi utiliser composer dump-autoload pour mettre à jour l’autochargeur sans passer par une mise à jour.

55
Sergiy Sokolenko

Il existe également d'autres façons d'utiliser les fonctionnalités de chargement automatique composer. Moyens qui peuvent être utiles pour charger des packages sans espaces de noms ou des packages fournis avec une fonction de chargement automatique personnalisée.

Par exemple, si vous souhaitez inclure un seul fichier contenant une fonction de chargement automatique, vous pouvez utiliser la directive "files" comme suit:

"autoload": {
    "psr-0": {
        "": "src/",
        "SymfonyStandard": "app/"
    },
    "files": ["vendor/wordnik/wordnik-php/wordnik/Swagger.php"]
},

Et dans le fichier Swagger.php, Nous avons:

function swagger_autoloader($className) {
    $currentDir = dirname(__FILE__);
    if (file_exists($currentDir . '/' . $className . '.php')) {
        include $currentDir . '/' . $className . '.php';
    } elseif (file_exists($currentDir . '/models/' . $className . '.php')) {
        include $currentDir . '/models/' . $className . '.php';
    }
}
spl_autoload_register('swagger_autoloader');

https://getcomposer.org/doc/04-schema.md#files

Sinon, vous pouvez utiliser une référence de classmap:

{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}

https://getcomposer.org/doc/04-schema.md#classmap

Remarque: pendant vos tests, n'oubliez pas de lancer la commande composer dump-autoload Ou vous ne verrez aucun changement!

./composer.phar dump-autoload

Joyeux chargement automatique =)

22
Francesco Casula

À mon avis, la réponse de Sergiy devrait être la réponse choisie pour la question donnée. Je partage ma compréhension.

Je cherchais à charger automatiquement mes fichiers de paquet en utilisant composer que j'ai sous la structure de dir donnée ci-dessous.

<web-root>
    |--------src/
    |           |--------App/
    |           |
    |           |--------Test/
    |
    |---------library/
    |
    |---------vendor/
    |           |
    |           |---------composer/
    |           |           |---------autoload_psr4.php
    |           |           
    |           |----------autoload.php
    |
    |-----------composer.json
    |

J'utilise psr-4 spécification de chargement automatique.

Il a fallu ajouter des lignes ci-dessous au fichier composer.json du projet. J'ai l'intention de placer mes fichiers de classe dans les répertoires src/App, src/Test et library.

"autoload": {
        "psr-4": {
            "OrgName\\AppType\\AppName\\": ["src/App", "src/Test", "library/"]
        }
    } 

C'est à peu près explicite. OrgName\AppType\AppName est mon préfixe d'espace de nom prévu. Par exemple, pour l'utilisateur de classe dans src/App/Contrôleur/Fournisseur/User.php -

namespace OrgName\AppType\AppName\Controller\Provider; // namespace declaration

use OrgName\AppType\AppName\Controller\Provider\User; // when using the class

Notez également que "src/App", "src/Test" .. proviennent de la racine de votre site Web où se trouve votre composer.json. Rien à voir avec le répertoire du vendeur. jetez un oeil à vendor/autoload.php

Maintenant si composer est installé correctement, tout ce qui est requis est # compositeur update

After composer mettez à jour mes classes chargées avec succès. Ce que j’ai observé est que composer ajoute une ligne dans vendor/composer/autoload_psr4.php

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
    'OrgName\\AppType\\AppName\\' => array($baseDir . '/src/App', $baseDir . '/src/Test', $baseDir . '/library'),
);

Voici comment composer cartes. Pour la psr-0, la cartographie se trouve dans vendeur/composer/autoload_classmap.php

12
nayak

Créez simplement un lien symbolique dans votre dossier src pour l'espace de noms pointant vers le dossier contenant vos classes ...

ln -s ../src/AppName ./src/AppName

Votre autoload dans composer aura le même aspect ...

"autoload": {
    "psr-0": {"AppName": "src/"}
}

Et vos classes d'espaces de noms AppName vont démarrer un répertoire à partir de votre répertoire de travail actuel dans un dossier src maintenant ... qui devrait fonctionner.

3
JamesHalsall

La configuration du chargement automatique commence en dessous du répertoire du fournisseur. Donc, vous voudrez peut-être changer le répertoire du fournisseur, par exemple.

{
    "config": {
        "vendor-dir": "../vendor/"
    },
    "autoload": {
        "psr-0": {"AppName": "src/"}
    }
}

Ou n'est-ce pas possible dans votre projet?

3
acme