2015-07-19 23 views
13

Ecco la mia struttura di cartelle:PHP aggiungendo spazio dei nomi personalizzato utilizzando caricatore automatico dal compositore

Classes 
    - CronJobs 
    - Weather 
     - WeatherSite.php 

voglio caricare classe WeatherSite dal mio script. Im usando compositore autoload:

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

Im supponendo che il codice di cui sopra è l'aggiunta dello spazio dei nomi e il percorso che namespace risolve. Ma quando la pagina viene caricata ottengo sempre questo errore:

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

Qui è il mio file WeatherSite.php:

namespace Classes\Weather; 

class WeatherSite { 

    public function __construct() 
    { 

    } 

    public function findWeatherSites() 
    { 

    } 

} 

Che cosa sto facendo di sbagliato?

+0

In realtà non è necessario caricatore automatico personalizzato, probabilmente si può usare PSR-4. Usi 'composer.json'? In tal caso, potresti aggiungere il suo contenuto nella sezione 'autoload'? –

+0

@ Tomáš Votruba Ho pensato alle classi personalizzate che scrivo Dovrei aggiungere gli spazi dei nomi allo script del caricatore automatico fornito con il compositore? – John

risposta

20

In realtà non è necessario il caricatore automatico, è possibile utilizzare PSR-4.

Aggiornare il autoload sezione composer.json:

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

da spiegare: è { "Spazio dei nomi \\": "directory per essere trovato in"}

Non dimenticare di eseguire composer dump-autoload per aggiornare Cella del compositore.

Quindi è possibile utilizzare in questo modo:

include(LIBRARY .'autoload.php'); 

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

Grazie, ma come faccio a fare riferimento allo spazio dei nomi nello script, quindi? Devo ancora aggiungere Classi di Namespace all'inizio del mio file di classe personalizzato, WeatherSite.php? E nello script che chiama la classe è solo $ site_weather = new Classes \ Weather \ SiteWeather()? – John

+0

Ho aggiornato la mia risposta. –

+0

Nevermind, l'ho fatto funzionare, ma solo se lo spazio dei nomi nel compositore punta alla sottodirectory in cui si trova il file php. Quindi se compositore lo ho Classi => classe/CronJobs poi nello script $ weather = new Classes \ Meteo \ WeatherSite(); Ricevo ancora l'errore, ma se aggiorno il compositore su Classes => class/CronJobs/Weather ora funziona. Qualche idea su cosa sto ancora facendo male? – John