wake-up-neo.com

Symfony3 ClassNotFoundException nach der Bundle-Erstellung

Ich wollte ein neues 3.3-Projekt in Symfony starten und begann wie üblich:

1.) Neues Projekt anlegen: symfony new ArtProject

2.) Erstellen eines neuen Bundles: php app/console generate:bundle (Paul/ArtBundle, yml, src /)

Dann führe ich den lokalen Server aus und wenn ich 127.0.0.1:8000 öffne, erhalte ich diese schöne Nachricht:

(1/1) ClassNotFoundException

Es wurde versucht, die Klasse "PaulArtBundle" aus dem Namespace .__ zu laden. "Paul\ArtBundle". Haben Sie eine "use" -Anweisung für eine andere .__ vergessen? Namensraum? in AppKernel.php (Zeile 19)

Was seltsam ist und ich habe nicht herausgefunden, warum das so weit passiert. Vor dem Erstellen des Bundles ist kein Fehler aufgetreten. Ich habe die typische Startseite von Symfony gesehen.

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
{
}

Irgendeine Idee, was dort los ist? Ich habe nichts geändert, ich habe nur diese Befehle ausgeführt.

27
pguetschow

Ich habe gerade eine neue Version von S3.3.4 (neueste Version zum Zeitpunkt des Schreibens) mit folgendem installiert:

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/

Der Browser wurde aktualisiert und natürlich wurde die Nachricht nicht gefunden.

Der Befehl generate: bundle aktualisiert den Autload-Abschnitt von composer.json nicht, wenn ein neuer Namespace eingeführt wird. Bearbeiten Sie composer.json und:

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

Dann renne

composer dumpautoload

Und den Server neu starten (vielleicht). Das sollte das nicht gefundene Problem der Bündelklasse beheben. 

Ich habe den Befehl generate: bundle nicht verwendet, seit der Standard alles AppBundle unterstellt hat, also weiß ich nicht, wie lange dies "gebrochen" ist. Aber mindestens drei Fragen in der letzten Woche deuten darauf hin, dass es etwas Neues war.

Übrigens, als ich den Browser auffrischte, bekam ich "Hello World", was mich ein bisschen warf. Es stellt sich heraus, dass das neue Paket die/route überschreibt, die auch eine besondere Eigenschaft ist.

Und falls sich jemand wundert, warum dies geschah, hat sich Symfony 3.2 geändert

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

Sie können es immer wieder zurücksetzen, obwohl ich denke, dass das Herausschreiben einzelner Namespaces "besser" ist. Nicht sicher.

Und hier ist eine Ausgabe mit mehr Details: https://github.com/symfony/symfony-standard/issues/1098

Sieht aus, als würde der Betreuer eine kleine Geschwindigkeitsverbesserung gegenüber dem Brechen eines bestehenden Befehls bevorzugen. Naja. Symfony Flex soll alles wieder gut machen.

60
Cerad

Wenn Sie ein Bundle für use in mehreren Projekten erstellen (mit eigenem Namensraum), müssen Sie es wie folgt in den composer.json einfügen:

Nehmen wir an, Ihr Bundle-Name lautet CompanyFooBundle mit Namespace Company\Bundle\FooBundle. Dann sollte der Autoload-Abschnitt des Komponisten folgendermaßen aussehen:

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

Das funktioniert für mich in:

Generieren Sie Ihr Bundle mit 

./console erzeugen: bündel

Führen Sie die Schritte wie immer aus, und tun Sie in der Datei composer.json mit der Zeile, was Sie möchten 

"AppBundle\\": "src/AppBundle"

Ersetzen Sie durch "": "src/" oder fügen Sie Ihr Bundle hinzu, zum Beispiel: "BackendBundle\\": "src/BackendBundle"

Hier ist der neue Teil:

  1. Installieren Sie Composer in Ihrem bin-Verzeichnis, kopieren Sie die Schritte von https://getcomposer.org/download/ und fügen Sie sie ein.

  2. Legen Sie eine Ebene in Ihrem Projektverzeichnis an und führen Sie in Ihrem Stammordner (Ihres Projekts) den nächsten Befehl aus

php ./bin/composer.phar aktualisieren

0
Zahit Rios