Le chargement automatique du compositeur ne trouve pas cette classe
P粉403804844
P粉403804844 2024-03-26 15:07:50
0
1
462

J'ai un projet avec la structure suivante :

- src
  + Guitar.php
  + Type.php
  + ToString.php
- tests
  + GuitarTest.php
composer.json

Voici comment je définis le chargement automatique psr-4 dans composer.json :

"autoload": {
    "psr-4": {
        "Shop\Guitar\": "src/"
    }
}

Voici mon Guitar.php :

<?php

namespace Shop\Guitar;

require_once __DIR__ . '/../vendor/autoload.php';

use Shop\Guitar\Type;

class Guitar
{
    public function __construct(public readonly string $serialNumber, public readonly Type $type)
    {
    }
}

Voici mon ToString.php :

<?php

namespace Shop\Guitar;

require_once __DIR__ . '/../vendor/autoload.php';

interface ToString
{
    public function toString(): string;
}

Voici mon Type.php :

<?php

namespace Shop\Guitar;

require_once __DIR__ . '/../vendor/autoload.php';

enum Type implements ToString
{
    case ACOUSTIC;
    case ELECTRIC;

    public function toString(): string
    {
        return match($this)
        {
            self::ACOUSTIC => 'Acoustic',
            self::ELECTRIC => 'Electric',
        };
    }
}

Voici mon GuitarTest.php :

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use PHPUnit\Framework\TestCase;
use Shop\Guitar\Guitar;
use Shop\Guitar\Type;

final class InventoryTest extends TestCase
{
    public function testGuitarConstructor(): void
    {
        $guitar = new Guitar('foo', Type::ELECTRIC);
    }
}

Mais lorsque j'exécute le test, j'obtiens l'erreur suivante :

Error: Class "Shop\Guitar\Guitar" not found

Quel est le problème ? Comment résoudre?

P粉403804844
P粉403804844

répondre à tous(1)
P粉764836448

Ceci est juste une question sur le chargeur automatique Composer en configuration PSR-4.

  • Votre configuration composer.json semble légitime.
  • require_once les appels ne le seront pas. Il s'agit d'un chargeur automatique et les fichiers de classe ne doivent pas nécessiter de chargeur automatique.

En cas de doute, testez la configuration de votre autoloader.

Prochaines étapes :

  1. Supprimez ces require_once appels, ils ne font que vous distraire et gêner le dépannage. La configuration du chargement automatique est valide ou non valide. Cela nécessite plus de maintenance si vous répartissez les points d'inclusion sur différents fichiers, mais ce n'est absolument pas nécessaire.

  2. Réorganisez vos 测试modules pour introduire des tests de configuration de l'autoloader car vous rencontrez des problèmes :

    1. Déplacez le contenu de tests 移至 tests/unit et fournissez un répertoire dédié aux tests unitaires.

    2. Créé tests/php 子文件夹并在其中创建 autoloading.php 文件。该文件夹用于 PHP 测试,即直接使用 PHP 执行它们(例如 phptests/php/autoloading.php). Contenu du fichier :

      Référence :

  3. Exécutez le test de configuration du chargeur automatique pour vérifier si le fichier peut être chargé

    $ php tests/php/autoloading.php
    

(Il ne peut rien imprimer, mais il peut imprimer n'importe quoi. L'important est qu'il s'exécute, et non un fichier introuvable ou un type d'erreur similaire.

Si vous parvenez à exécuter des fichiers PHP de cette façon, liez-les à votre configuration Composer. Cela vous permet de tester la configuration du chargeur automatique.

Ajoutez un nouveau script à votre composer.json configuration :

{
    "script": {
        "post-autoload-dump": [
            "@php -dzend.assertions=1 -dassert.exception=0 tests/php/autoloading.php"
        ]
    }
}

Référence :

et testez-le :

$ composer run-script post-autoload-dump
> @php -dzend.assertions=1 -dassert.exception=0 tests/php/autoloading.php
PHP Warning:  assert(): [ ...

(Cela ne donne pas de résultat, ici j'ai ajouté quelques avertissements pour montrer à quoi cela ressemble)

Cela exécutera le nouveau test de configuration de chargement automatique et activera les assertions en mode avertissement. Autrement dit, si une fonction ***_exists() renvoie false, vous verrez une erreur. Cela signifie que l'interface/l'énumération/la classe ne peut pas être chargée.

Vous pouvez passer -dassert.exception=0 更改为 -dassert.exception=1 (0 -> 1代码>)。然后测试将以非零代码退出(状态 255 pour les exceptions non détectées).

C'est ce que tu veux, will -dassert.exception=0 更改为 -dassert.exception=1 并再次保存 composer.json .

Vous pouvez ensuite tester votre autoloader à l'aide de n'importe quelle commande Composer qui vide l'autoloader :

  • 作曲家转储自动加载
  • 作曲家安装
  • 作曲家更新

Bon test.


Un test approprié, peut-être aussi vérifier si phpunit est toujours en cours d'exécution :

$ composer exec phpunit -- tests/unit
PHPUnit ...

Testez à nouveau, lorsque vous trouvez le coupable et que tout est revenu à la normale, vous pouvez exécuter tous les tests en utilisant un seul script d'écriture.

Common est un script avec le mot test : 

{
    "script": {
        "post-autoload-dump": [
            "@php -dzend.assertions=1 -dassert.exception=0 tests/php/autoloading.php"
        ],
        "test": [
          "@composer dump-autoload",
          "@composer exec phpunit"
        ]
    }
}

Et tu n’as pas besoin d’écrire composer run-script test,只需 composer test tout le temps ça suffit :

$ composer test
Generating autoload files
Generated autoload files
> @php -dzend.assertions=1 -dassert.exception=1 tests/php/autoloading.php
PHPUnit ...
Time: 28 ms, Memory: 4.00MB

No tests executed!

(Dans cet exemple de sortie, je n'ai pas configuré les tests phpunit, mais vous voyez l'idée)


Alors, de quel genre de test s'agit-il ? Eh bien, j'appelle cela un test de configuration, c'est juste une vérification rapide où vous pouvez vérifier certaines choses PHP. N'ajoutez pas beaucoup de tests de ce type et gardez votre plan de test petit. Vous pouvez l'utiliser pour résoudre les problèmes que vous rencontrez lors de la configuration de votre projet. Conservez-le jusqu'à un an et si vous restez sans erreur, vous pouvez envisager de le supprimer.

Cependant, cet exemple montre comment rapprocher certains chèques de l'emplacement configuré et les lier ensemble. S'il y a un état de sortie différent de zéro, Composer fera échouer l'ensemble du processus.

De plus, vous pouvez ajouter une description à chaque script d'écrivain afin qu'un message s'affiche :

{
    "scripts-descriptions": {
        "test": "Runs all tests."
    }
}
$ composer list
...
  test                 Runs all tests.
...

(Voir : Description personnalisée - Documentation du script du compositeur)

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal