2017-07-06 68 views
22

chciałem rozpocząć nowy projekt w Symfony 3.3 i zaczął jak zwykle:Symfony3 ClassNotFoundException po utworzeniu wiązki

1.) Tworzenie nowego projektu: symfony new ArtProject

2.) tworząc nowy pakiet: php app/console generate:bundle (Paul/ArtBundle, yml, src /)

Potem uruchom serwer lokalny, a kiedy otworzy 127.0.0.1:8000 otrzymuję tę piękną wiadomość:

(1/1) ClassNotFoundException

Próba załadowania klasy "PaulArtBundle" z przestrzeni nazw "Paul \ ArtBundle". Czy zapomniałeś o instrukcji "use" dla innej przestrzeni nazw ? w AppKernel.php (wiersz 19)

Co jest dziwne i nie wiem, dlaczego tak się dzieje. Przed utworzeniem pakietu nie wystąpił błąd; Widziałem typową stronę startową 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 
{ 
} 

jakiś pomysł co się dzieje tam? Nic nie zmieniłem, wykonałem tylko te polecenia.

+0

Sprawdź AppKernel.php, czy to prawda? –

+0

@SamJanssens tak, mogę też przeskoczyć do pliku php w moim IDE od kernela – TechTreeDev

+0

Czy dobrze zarejestrowałeś nowy plik Bundle @ Appkernel.php? –

Odpowiedz

49

Właśnie zainstalowałem nową kopię S3.3.4 (najnowsza wersja jak to pisze), używając:

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/ 

odświeżony przeglądarkę i na pewno wystarczy mam klasę Nie znaleziono wiadomości.

Komenda generate: bundle nie aktualizuje sekcji automatycznego ładowania pliku composer.json po wprowadzeniu nowej przestrzeni nazw. Edycja composer.json oraz:

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

Następnie uruchom

composer dumpautoload 

i zrestartować serwer (być może). To powinno naprawić problem z klasą zestawu.

Nie użyłem polecenia generate: bundle już jakiś czas temu, ponieważ standardem było umieszczenie wszystkiego w AppBundle, więc nie wiem, jak długo zostało to "zerwane". Ale co najmniej trzy pytania w ostatnim tygodniu wskazują, że było to coś nowego.

A przy okazji, kiedy odświeżyłem przeglądarkę, otrzymałem "Hello World", który rzucił mnie na chwilę. Okazuje się, że nowy pakiet przesłonił/route, który również jest czymś specjalnym.

aw przypadku ktokolwiek zastanawia się, dlaczego to się zaczęło, Symfony 3.2 zmieniono z

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

Zawsze można po prostu zmienić go z powrotem choć myślę literowania poszczególnych nazw może być „lepszy”. Niepewny.

I tu jest problem więcej szczegółów: https://github.com/symfony/symfony-standard/issues/1098

Wygląda opiekun uprzywilejowanych niewielką poprawę prędkości ponad zerwania istniejącego polecenia. No cóż. Symfony Flex ma sprawić, że wszystko znów będzie wspaniałe.

+0

Tak, działało, po tym zrestartowano serwer. Tahnks :) – TechTreeDev

+0

Niesamowita praca tam. Dziękuję za odpowiedź. Spędziłem dni dosłownie walcząc z tym. – karbonphyber

+0

Właśnie napisałem to pytanie https://stackoverflow.com/questions/45151067/class-not-found-exception-in-appkernel-after-moving-to-symfony2-8-24 które zostało oznaczone jako duplikat i tak, to jedna jest dość podobna tylko ja przechodziłem od 2.8.9 do 2.8.24 (gdzie wpis ** psr-4 ** jest już inny) i zrobiłem to, co zostało tu opisane, z wyjątkiem linii 'composer dumpautoload' która jest poza stołem dla mnie, o czym wspomniałem w swoim pytaniu, czy możesz wskazać obejście tego problemu, dzięki –

1

Jeśli wygenerować wiązkę dla użycia w wielu projektach (z własnej przestrzeni nazw) trzeba dodać ją w composer.json jak follwed:

Załóżmy nazwę pakiet jest CompanyFooBundle z nazw Company\Bundle\FooBundle wtedy autoload kompozytor sekcja powinna wyglądać następująco:

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