2015-07-19 4 views
13

Hier ist meine Ordnerstruktur:PHP benutzerdefinierte Namespace Hinzufügen von mit Autoloader von Komponisten

Classes 
    - CronJobs 
    - Weather 
     - WeatherSite.php 

Ich mag WeatherSite Klasse laden von meinem Skript. Im mit Komponisten mit Autoload:

$loader = include(LIBRARY .'autoload.php'); 
$loader->add('Classes\Weather',CLASSES .'cronjobs/weather'); 
$weather = new Classes\Weather\WeatherSite(); 

Im der obigen Code unter der Annahme, fügt den Namespace und den Weg, den Namespace aufgelöst wird. Aber wenn die Seite geladen ich immer diese Fehlermeldung erhalten:

Fatal error: Class 'Classes\Weather\WeatherSite' not found 

Hier ist meine WeatherSite.php Datei:

namespace Classes\Weather; 

class WeatherSite { 

    public function __construct() 
    { 

    } 

    public function findWeatherSites() 
    { 

    } 

} 

Was mache ich falsch?

+0

Sie brauchen eigentlich keine benutzerdefinierten Autoloader, können Sie wahrscheinlich PSR-4 verwenden. Benutzt du 'composer.json'? Wenn ja, könnten Sie den Inhalt in 'autoload' hinzufügen? –

+0

@ Tomáš Votruba Ich dachte für benutzerdefinierte Klassen, die ich schreibe Ich müsste die Namespaces zum Autoloader-Skript hinzufügen, das mit Composer kommt? – John

Antwort

20

Sie brauchen keinen benutzerdefinierten Autoloader, Sie können PSR-4 verwenden.

Aktualisieren Sie Ihre autoload Abschnitt in composer.json:

"autoload": { 
    "psr-4": {"Classes\\Weather\\": "Classes/CronJobs/Weather"} 
} 

zu erklären: es ist { "Namespace \\": "Verzeichnis gefunden werden"}

Vergessen Sie nicht composer dump-autoload zu aktualisieren zu laufen Composer-Cache

Dann können Sie es wie folgt verwenden:

include(LIBRARY .'autoload.php'); 

$weather = new Classes\Weather\WeatherSite(); 
+0

Danke, aber wie referenziere ich dann den Namensraum im Skript? Muss ich noch Namespace-Klassen am Anfang meiner benutzerdefinierten Klassendatei WeatherSite.php hinzufügen? Und in dem Skript, das die Klasse aufruft, ist es nur $ site_weather = new Classes \ Weather \ SiteWeather()? – John

+0

Ich aktualisierte meine Antwort. –

+0

Nevermind, ich habe es funktioniert, aber nur, wenn der Namespace im Composer auf das Unterverzeichnis verweist, in dem sich die PHP-Datei befindet. Wenn also composer ich Klassen => class/CronJobs habe, dann im Skript $ weather = new Classes \ Wetter \ WetterSeite(); Ich bekomme immer noch den Fehler, aber wenn ich den Compiler auf Classes => class/CronJobs/Weather aktualisiere, funktioniert es jetzt. Irgendeine Idee, was mache ich noch falsch? – John