web-dev-qa-db-fra.com

Symfony3 ClassNotFoundException après la création du paquet

Je voulais démarrer un nouveau projet 3.3 dans Symfony et j'ai démarré comme d'habitude:

1.) Création du nouveau projet: symfony new ArtProject

2.) Créer un nouveau lot: php app/console generate:bundle (Paul/ArtBundle, yml, src /)

Ensuite, je lance le serveur local et quand j'ouvre 127.0.0.1.18000, je reçois ce beau message:

(1/1) ClassNotFoundException

Tentative de chargement de la classe "PaulArtBundle" à partir de l'espace de noms "Paul\ArtBundle". Avez-vous oublié une instruction "use" pour une autre espace de noms? dans AppKernel.php (ligne 19)

Ce qui est étrange et je n'ai pas compris pourquoi cela se soit produit jusqu'à présent. Avant de créer le paquet, il n'y avait pas d'erreur; J'ai vu la page de démarrage typique de symfony.

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

<?php

namespace Paul\ArtBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class PaulArtBundle extends Bundle
{
}

Une idée de ce qui se passe là-bas? Je n'ai rien changé, je n'ai fait que lancer ces commandes.

27
pguetschow

Je viens d'installer une nouvelle copie de S3.3.4 (la dernière version à ce jour) en utilisant:

composer create-project symfony/framework-standard-edition s334 "3.3.4"
bin/console generate:bundle
Share across multiple apps: yes
namespace: Paul\ArtBundle
bundle name: PaulArtBundle
Target Directory: src/

J'ai rafraîchi le navigateur et j'ai bien reçu le message de classe non trouvée.

La commande generate: bundle ne met pas à jour la section autload de composer.json lorsqu'un nouvel espace de nom est introduit. Editez composer.json et:

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

Puis courir

composer dumpautoload

Et redémarrez le serveur (peut-être). Cela devrait résoudre le problème de la classe bundle non trouvée. 

Je n'ai pas utilisé la commande generate: bundle depuis un certain temps déjà, car la norme consistait à tout mettre sous AppBundle, donc je ne sais pas combien de temps cela a été "cassé". Mais au moins trois questions au cours de la semaine dernière indiquent que c'était quelque chose de récent.

Et au fait, quand j'ai rafraîchi le navigateur, j'ai eu "Hello World" qui m'a un peu jeté. Il s'avère que le nouveau paquet remplace le chemin/qui est aussi spécial.

Et au cas où quelqu'un se demanderait pourquoi cela a commencé, Symfony 3.2 a changé de

#composer.json
"psr-4": { "": "src/" },
To
"psr-4": { "AppBundle\\": "src/AppBundle" },

Vous pouvez toujours le modifier, même si je pense qu'épeler des espaces de noms individuels peut être "meilleur". Pas certain.

Et voici un problème avec plus de détails: https://github.com/symfony/symfony-standard/issues/1098

On dirait que le responsable a privilégié une petite amélioration de la vitesse plutôt que de casser une commande existante. Tant pis. Symfony Flex est censé rendre tout bon à nouveau.

60
Cerad

Si vous générez un bundle pour utilisation dans plusieurs projets (avec son propre espace de noms), vous devez l'ajouter dans le composer.json comme suit:

Supposons que le nom de votre ensemble est CompanyFooBundle avec namespace Company\Bundle\FooBundle, la section autoload composer devrait alors ressembler à ceci:

...
"autoload": {
    "psr-4": {
        "Company\\Bundle\\FooBundle\\": "src/Company/Bundle/FooBundle"
    },
    "classmap": [
        "app/AppKernel.php",
        "app/AppCache.php"
    ]
},
...
3
ownking

Cela fonctionne pour moi dans:

Générez votre paquet avec 

./console générer: bundle

Et suivez les étapes comme toujours, maintenant, faites ce que vous voulez dans votre fichier composer.json avec la ligne 

"AppBundle\\": "src/AppBundle"

Remplacez par "": "src/" ou ajoutez votre paquet, par exemple: "BackendBundle\\": "src/BackendBundle"

Voici la nouvelle partie:

  1. Installez composer dans votre répertoire bin, copiez et collez les étapes à partir de https://getcomposer.org/download/

  2. Niveau supérieur dans votre répertoire de projet et dans votre dossier racine (de votre projet), exécutez la commande suivante

php ./bin/composer.phar mise à jour

0
Zahit Rios