Maison  >  Article  >  développement back-end  >  Pourquoi Symfony3 lance-t-il une exception ClassNotFoundException après avoir généré un bundle ?

Pourquoi Symfony3 lance-t-il une exception ClassNotFoundException après avoir généré un bundle ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-22 09:31:11969parcourir

Why Does Symfony3 Throw a ClassNotFoundException After Generating a Bundle?

Symfony3 ClassNotFoundException dévoilée

Un utilisateur a rencontré la redoutable ClassNotFoundException alors qu'il se lançait dans un nouveau projet Symfony3 après avoir créé un bundle. Plonger dans les détails :

  1. Un nouveau projet Symfony a été lancé avec symfony new ArtProject.
  2. Un nouveau bundle a été généré à l'aide de php app/console generate:bundle Paul/ArtBundle, yml , src/.

À leur grand désarroi, en tentant d'accéder 127.0.0.1:8000 a entraîné le fameux message d'erreur : "ClassNotFoundException : tentative de chargement de la classe "PaulArtBundle" à partir de l'espace de noms "PaulArtBundle".

Dévoilement de la cause

Le L'utilisateur a soigneusement examiné le code et a remarqué que AppKernel.php contenait ce qui suit déclaration :

public function registerBundles()
{
    $bundles = [
        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        ......
        new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
        new AppBundle\AppBundle(),
        new Paul\ArtBundle\PaulArtBundle(),
    ];
}

et le PaulArtBundle a été défini comme :

<?php

namespace Paul\ArtBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class PaulArtBundle extends Bundle
{
}

Le chaînon manquant découvert

Après beaucoup de réflexion, il a été découvert que la commande generate:bundle n'a pas réussi à mettre à jour la section autoload de composer.json, négligeant d'ajouter le nouveau espace de noms.

La résolution

Pour corriger le problème, l'utilisateur a modifié manuellement composer.json et mis à jour la section de chargement automatique :

# composer.json
"autoload": {
    "psr-4": {
        "AppBundle\": "src/AppBundle",
        "Paul\": "src/Paul"
    },
    "classmap": [ "app/AppKernel.php", "app/AppCache.php" ]
}

Exécution composer dumpautoload et le redémarrage du serveur ont résolu l'exception ClassNotFoundException.

Supplémentaire Remarque

L'utilisateur a observé que le nouveau bundle remplaçait la route par défaut (/), d'où le message d'accueil inattendu « Hello World ».

Un aperçu intéressant

Avant Symfony 3.2, la configuration composer.json supposait un mappage PSR-4 sans espace de noms. Cependant, Symfony 3.2 a introduit une approche plus explicite, spécifiant explicitement les espaces de noms. Ce changement a peut-être contribué à ce problème.

Conclusion

Bien que la commande generate:bundle ait toujours été un moyen simple de créer des bundles, les changements récents dans la configuration de chargement automatique de Symfony nécessitent une intervention manuelle pour garantir une intégration transparente du bundle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn