2013-07-11 9 views
12

Ich habe einen Bibliotheksordner im App-Ordner erstellt, um meine App-Bibliotheken hinzuzufügen. Ich habe Datei app Config aktualisiert und composer.json automatisch zu laden, die Ordner, aber wenn ich den Befehl composer dump-autoload laufen bekomme ich den nächsten Fehler:Wie man 'Bibliotheken' in Laravel 4 automatisch lädt?

{"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]

Meine app Ordnerbaum:

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 Im Grunde genommen auf

"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" 
    //  } 
    }, 

, muss ich automatisch zu laden alle Bibliotheken innerhalb der ‚Bibliotheken‘ Ordner.

+0

Sie könnten einfach eine Zeile hinzufügen: '" app/libraries "' zum classmap Abschnitt? –

+0

nicht die Ordner in Classmap, laden Sie nur die Dateien im Stammverzeichnis, nicht in Unterordnern. –

Antwort

23

Sie sollten einen Namespace auf oberster Ebene für Ihre Anwendung erstellen.

Dann setzen Sie alle Bibliotheken Sie Code unter diesem Namespace. Hinweis: Alle Drittanbieter-Bibliotheken sollten (hoffentlich) über Composer installiert werden und daher über ein eigenes Namespace-/Autoloading-Setup verfügen.

Ihre Verzeichnisstruktur wäre dann:

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

dann Ihre Klassen, die Namespace folgen:

Datei: Myapp/Search/Search.php:

<?php namespace Myapp\Search; 

class Search { ... } 

Und schließlich Ihre autoloading Setup:

"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 für Ihre Antwort. dieser Weg funktioniert, aber ich denke, die Dateistruktur ist ein wenig redundant. es gibt keinen anderen Weg, Autoloading zu machen? –

+0

Während es sich zunächst überflüssig anfühlt, wenn Sie mehr Funktionalität aufbauen, hilft es meiner Meinung nach, die Dinge sauber und organisiert zu halten. –

+0

Wie funktioniert das mit Controllern? Zum Beispiel habe ich eine API mit dem Namespace Kitties/Api10; in meinen Controllern. Würde ich Bibliotheken/Kitties/Api10/PoniesLibrary.php und in PoniesLibrary den Namespace Kitties/Api10 benutzen? – Lotus