34 votes

Symfony3 ClassNotFoundException après la création du bundle

Je voulais commencer une nouvelle 3.3 projet Symfony et a commencé comme d'habitude:

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

2.) La création d'un nouveau Bundle: php app/console generate:bundle (Paul/ArtBundle, yml, src/)

Puis-je exécuter le serveur local et lorsque j'ouvre 127.0.0.1:8000-je obtenir ce beau message:

(1/1) ClassNotFoundException

A tenté de charger la classe "PaulArtBundle" de l'espace de noms "Paul\ArtBundle". Avez-vous oubliez une instruction "use" pour un autre espace de noms? dans AppKernel.php (ligne 19)

Ce qui est étrange, et je n'ai pas compris pourquoi cela se produire à ce jour. Avant de créer le Bundle, il n'y a pas d'erreur, j'ai vu l'typiques de la page d'accueil 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
{
}

Aucune idée de ce qui se passe là-bas? Je n'ai pas changé une chose, je n'ai couru à ces commandes.

72voto

Cerad Points 13840

Je viens d'installer une nouvelle copie de S3.3.4 (dernière version en date de cette écriture) à l'aide de:

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/

Actualisé le navigateur et bien sûr j'ai eu la classe de ne pas trouvé de message.

La commande generate:bundle n'est pas la mise à jour de la autload section de compositeur.json lorsqu'un nouvel espace de noms est introduit. Edit compositeur.json et:

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

Ensuite, exécutez

composer dumpautoload

Et redémarrer le serveur(peut-être). Cela devrait résoudre le bundle classe pas trouvé de problème.

Je n'ai pas utilisé la commande generate:bundle est tout à fait un certain temps depuis que la norme était de tout mettre sous AppBundle donc je ne sais pas combien de temps ça a été "cassé". Mais, au moins trois questions dans la dernière semaine ou indique qu'il a été quelque chose de récent.

Et par ailleurs, quand j'ai actualisé le navigateur que j'ai "Hello World" qui m'a jeté un peu. S'avère le nouveau bundle remplace le / la route qui est aussi spécial.

Et dans le cas où quelqu'un se demande pourquoi cela a commencé, Symfony 3.2 changé de

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

Vous pouvez toujours juste le changer mais je pense que l'orthographe de certains espaces de noms peut être "mieux". Pas sûr.

Et voici une question avec plus de détails: https://github.com/symfony/symfony-standard/issues/1098

Ressemble le responsable favorisé une petite amélioration de la vitesse sur la coupure d'une commande existante. Oh bien. Symfony Flex est censé faire tout ce grand encore.

3voto

ownking Points 730

Si vous générez un bundle à utiliser 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 bundle soit CompanyFooBundle avec l'espace de noms Company\Bundle\FooBundle alors la section de chargement automatique du composeur devrait ressembler à:

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

0voto

Zahit Rios Points 9

Cela fonctionne pour moi:

Générer votre Bundle avec

./console generate:bundle

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

"AppBundle\\": "src/AppBundle"

Remplacer par "": "src/" ou ajouter votre bundle, par exemple: "BackendBundle\\": "src/BackendBundle"

Voici la nouvelle partie:

  1. Installer compositeur dans votre répertoire bin, copier et coller les étapes de https://getcomposer.org/download/

  2. D'un niveau dans votre répertoire de projet, et dans la racine de votre dossier (projet) exécuter la commande suivante

php ./bin/compositeur.phar update

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X