2013-02-19 11 views
11

Utworzyłem pakiet zgodny z "Creating a Package" instructions in the Laravel 4 documentation. Po utworzeniu pakietu utworzyłem folder "kontrolery" i plik tras. Nowa struktura plików jest:Uzyskiwanie dostępu do kontrolerów pakietów w Laravel 4

/src 
    /Vendor 
     /Package 
      PackageServiceProvider.php 
    /config 
    /controllers 
    /lang 
    /migrations 
    /views 
    routes.php 
/tests 
/public 

Dodałem plik trasy do części bagażnika usługodawcy pakiet:

public function boot() 
{ 
    $this->package('vendor/package'); 
    include __DIR__ . '/../../routes.php'; 
} 

Następnie dodaje podstawową drogę do pliku trasach:

Route::get('/package', function() { 
    return "Package route test"; 
}); 

Odwiedzenie mojej aplikacji na określonej trasie (app.dev/package) zwraca oczekiwaną liczbę:

Package route test 

następnie dodanie podstawowego kontrolera wezwanie do trasy (przy użyciu domyślnego kontrolera laravel „HomeController”) działa:

Route::get('/package', '[email protected]'); 

Potem następuje this SO answer konfigurowania regulatora na opakowaniu. Dodałem folder src/controllers do classmap kompozytora, a potem rzucił autoloadera i sprawdzone vendor/kompozytor/autoload_classmap.php i okazało się, że klasa jest pomyślnie załadowany przez kompozytora:

<?php 

// autoload_classmap.php generated by Composer 

$vendorDir = dirname(__DIR__); 
$baseDir = dirname($vendorDir); 

return array(
    'HomeController' => $baseDir . '/src/controllers/HomeController.php', 
); 

Teraz dodałem nowy kontroler pakietu na trasie z użyciem nazw:

Route::get('/package', 'Vendor\Package\Controllers\[email protected]'); 

ale to generuje błąd o nie znalezieniu klasa:

ReflectionException: Class Vendor\Package\Controllers\HomeController does not exist 

próbowałem również nazywając ją u śpiewać nazwę pakietu:

Route::get('/package', 'Package::[email protected]'); 

która produkuje ten sam błąd:

ReflectionException: Class Vendor\Package\Controllers\HomeController does not exist 

Bez względu na to, co staram pakiet nie może uzyskać dostępu swój własny sterownik, który kompozytor potwierdzeniem jest załadowany (wyświetlając vendor/pakiet/autoload_classmap.php).

Wszelkie pomysły? Nie jestem pewien, czy problem polega na tym, że kompozytor nie ładuje klasy, nie jestem pewien, od czego zacząć od debugowania problemu. Stworzyłem inny pakiet i powtórzyłem kroki tutaj i otrzymałem ten sam problem.

mogę uzyskać dostęp do widoków pakietów zarówno z pakietu i aplikacji, na przykład:

View::make('package::view'); 

Problem wydaje się być między kompozytora załadowaniu sterownika i laravel mogąc do niego dostęp.

Odpowiedz

16

Błąd polegał na włączeniu ścieżki kontrolerów na trasie.Miałem następujące:

Route::get('/package', 'Vendor\Package\Controllers\[email protected]'); 

Prawidłowe użycie jest:

Route::get('/package', 'Vendor\Package\[email protected]'); 

Z nazw zawarte w kontrolerze:

namespace Vendor\Package; 

Kontroler powinien wystawać oświetlania:

\Illuminate\Routing\Controllers\Controller 

Sti Nie mogę używać nazwy pakietu (np: Package :: HomeController @ showWelcome), ale mogę używać przestrzeni nazw. yay.

Problem rozwiązany.

+0

Po prostu gram grę Laravel 4 i napotkałem ten problem. Czy naprawdę potrzebujesz dodać każdą klasę do pliku vendor/composer/autoload_classmap.php? Myślisz, że byłoby w stanie znaleźć te klasy bez tego byś nie zrobił? – neilcrookes

+0

@neilcrookes Z powodów związanych z wydajnością kompozytor generuje płaską mapę klas wszystkich klas, ten plik jest generowany automatycznie i bardzo trudno jest ręcznie go edytować, ale tylko szybki test. Jest generowany przy użyciu informacji z pliku composer.json. Zobacz http://getcomposer.org/doc/04-schema.md#autoload – rich97

+0

+1 Dziękujemy za odpowiedź i odpowiedź na własne pytanie. – rich97

6

Możesz spróbować zmienić swój vendor/Package/composer.json i wstawić do kontrolerów dir autoload/classmap:

.... 
"autoload": { 
    "classmap": [ 
     "src/migrations", 
     "src/controllers", 
     "src/models" 
    ], 
    "psr-0": { 
     "Package\\Controller": "src/" 
    } 
} 
.... 

potem otworzyć terminal i od głównego pakietu dir zrobić zrzut kompozytor -autoload

Works dla mnie ...

+0

O ile wiem i doświadczony to nie będzie działać dla pakietów dostawców, ale tylko dla pakietów w środowisku roboczym. Spróbuj usunąć plik composer.json w pakiecie dostawcy i zinstaluj automatycznie, nie ma to znaczenia, ponieważ wszystkie dane są ładowane z pliku composer.lock. Możesz edytować plik autoload_classmap.php. Jeśli chcesz wiedzieć, co dzieje się za sceną, sprawdź plik composer.lock i autoload_classmap.php, które dają dobry wgląd w mechanikę. Proszę popraw mnie jeżeli się mylę! – sidneydobber

Powiązane problemy