2013-07-11 13 views
12

Utworzono folder biblioteki w folderze aplikacji, aby dodać biblioteki mojej aplikacji. Mam zaktualizowany plik konfiguracyjny aplikacji i composer.json autoload do tego folderu, ale kiedy uruchomić polecenie composer dump-autoload dostanę następny błąd:Jak automatycznie ładować "biblioteki" w laravel 4?

{"error":{"type":"Symfony\\Component\\Debug\\Exception\\FatalErrorException","message":"Class 'App\\Libraries\\Search\\SearchServiceProvider' not found","file":"D:\\Users\\Miguel Borges\\Documents\\Trabalhos\\Tese\\portal\\bootstrap\\compiled.php","line":4130}}PHP Fatal error: Class 'App\Libraries\Search\SearchServiceProvider' not found in D:\Users\Miguel Borges\Documents\Trabalhos\Tese\portal\bootstrap\compiled.php on line 4130 [Finished in 1.1s with exit code 255]

folder Moje app drzewo:

app 
| ... 
+ libraries 
| + search 
| | - Search.php 
| | - SearchFacade.php 
| | - SearchServiceProvider.php 
| + lib2 
| | - ... 
| + lib3 
| | - ... 
| | - Theme.php 
| - ... 
- filters.php 
- routes.php 

SearchServiceProvider.php

namespace App\Libraries\Search; 

use Illuminate\Support\ServiceProvider; 

class SearchServiceProvider extends ServiceProvider { 

    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app['search'] = $this->app->share(function($app) 
     { 
      return new Search; 
     }); 
    } 

} 

composer.js na

"autoload": { 
     "classmap": [ 
      "app/commands", 
      "app/controllers", 
      "app/models", 
      "app/libraries", 
      "app/database/migrations", 
      "app/database/seeds", 
      "app/tests/TestCase.php" 
     ] 
     // , 
    //  "psr-0": { 
    //   "app": "app/libraries" 
    //  } 
    }, 

Zasadniczo muszę autoload wszystkie biblioteki w obrębie folderu do "bibliotek.

+0

Możesz dodać linię: '" app/libraries "' do sekcji classmap? –

+0

Nie, foldery w klasie, tylko ładują pliki w katalogu głównym, a nie w podfolderach. –

Odpowiedz

23

Powinieneś utworzyć przestrzeń nazw najwyższego poziomu dla swojej aplikacji.

Następnie umieść wszystkie biblioteki ty kod pod tą przestrzenią nazw. Uwaga: Wszelkie biblioteki stron trzecich powinny (miejmy nadzieję) zostać zainstalowane przez Composer i dlatego mają własną przestrzeń nazw/automatyczne ładowanie.

Twoja struktura katalogów będzie wówczas:

libraries 
    Myapp 
     Search (note directory is capitalized) 
      Search.php 
      SearchFacade.php 
      SearchServiceProvider.php 
     AnotherLib 

Wtedy twoje zajęcia będą podążać tą nazw:

Plik: Myapp/Search/Search.php:

<?php namespace Myapp\Search; 

class Search { ... } 

I wreszcie, twój setup autoloading:

"autoload": { 
    "classmap": [ 
     "app/commands", 
     "app/controllers", 
     "app/models", 
     "app/libraries", 
     "app/database/migrations", 
     "app/database/seeds", 
     "app/tests/TestCase.php" 
    ] 
    , 
    "psr-0": { 
     "Myapp": "app/libraries" 
    } 
}, 
+0

thx za odpowiedź. w ten sposób działa, ale myślę, że struktura plików jest nieco zbędna. nie ma innego sposobu na automatyczne ładowanie? –

+0

Chociaż początkowo wydaje się niepotrzebny, gdy tworzysz więcej funkcji, pomaga to w utrzymaniu czystości i uporządkowaniu. –

+0

Jak to działa w przypadku kontrolerów? Na przykład mam interfejs API z obszarami nazw Kits/Api10; w moich kontrolerach. Czy zrobiłbym biblioteki/Kitties/Api10/PoniesLibrary.php, a w PoniesLibrary używałam przestrzeni nazw Kitties/Api10? – Lotus