PHP aggiunta di spazio dei nomi personalizzato utilizzando autoloader dal compositore

Ecco la mia struttura di cartelle:

Classes
  - CronJobs
    - Weather
      - WeatherSite.php

Voglio caricare WeatherSite classe dal mio script. Im utilizzando il compositore con 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 di spazio dei nomi e il percorso che spazio dei nomi risolve. Ma quando la pagina viene caricata ricevo sempre questo errore:

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

Qui è il mio WeatherSite.php file:

namespace Classes\Weather;

class WeatherSite {

    public function __construct()
    {

    }

    public function findWeatherSites()
    {

    }

}

Che cosa sto facendo di sbagliato?

  • Si in realtà non hanno bisogno personalizzati autoloader, probabilmente si può utilizzare PSR-4. Si usa composer.json? Se è così, si potrebbe aggiungere è contenuto in autoload sezione?
  • Votruba ho pensato per le classi personalizzate scrivo vorrei aggiungere il namespace per l’autoloader script che viene fornito con il compositore?
InformationsquelleAutor John | 2015-07-19

 

One Reply
  1. 34

    Che in realtà non hanno bisogno di custom autoloader, è possibile utilizzare PSR-4.

    Aggiornare il autoload sezione composer.json:

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

    Da spiegare: è {“Namespace\\”: “directory per essere trovati nel”}

    Non dimenticare di eseguire composer dump-autoload per aggiornare Compositore cache.

    Quindi si può usare come questa:

    include(LIBRARY .'autoload.php');
    
    $weather = new Classes\Weather\WeatherSite();
    • Grazie, ma come faccio a riferimento il nome di spazio nello script, allora? Non ho ancora bisogno di aggiungere Classi dello spazio dei nomi al top della mia classe personalizzata di file, WeatherSite.php? E nello script che chiama la classe è solo $site_weather = new Classes\Meteo\SiteWeather()?
    • Ho aggiornato la mia risposta.
    • Nevermind, ho preso a lavorare, ma solo se lo spazio dei nomi nel compositore punti per la sub-directory che il file php è in. Quindi, se il compositore è l’ho Classi => classe/CronJobs poi nello script $meteo = new Classes\Meteo\WeatherSite(); ho ancora l’errore, ma se posso aggiornare il compositore per Classi => classe/CronJobs/Meteo ora funziona. Qualsiasi idea di cosa sto facendo ancora male?
    • Ok a quanto pare ho capito che fuori. Nel WeatherSite.php il file l’ho cambiato da spazio dei nomi di Classi dello spazio dei nomi Classes\Meteo e ora funziona. Grazie per il vostro aiuto. Potete confermare questo è il modo corretto di fare qualcosa come questo? O è un cattivo design”?
    • Scusa, ho corretto la mia risposta di conseguenza. Hai provato il composer.json modo? Questo è quello corretto. Utilizzando $loader cattiva pratica.
    • Cosa che ho fatto è stato nel compositore ho aggiunto la directory principale della mia cartella di classe invece di cronjob cartella secondaria. Poi nello script ho appena utilizzare tale spazio dei nomi per eseguire il drill down per la classe di cui ho bisogno. Quindi, in WeatherSite.php in alto, ora ho spazio dei nomi di Classi\CronJobs\Tempo; e poi nello script per chiamare ho $meteo = new Classes\CronJobs\Meteo\WeatherSite(); Im sperando che questo è il modo corretto di andare avanti. Ancora imparando a conoscere il compositore/autoload e gli spazi dei nomi
    • Questo potrebbe essere utile fonte per te: sitepoint.com/battle-autoloaders-psr-0-vs-psr-4 – controllare SOLO PSR-4 sezione, perché PSR-0 è sconsigliata a partire da Autunno 2014.
    • compositore di dump-autoload’ non funziona per me, ma ‘php artigianale ottimizzare il lavoro per me .

Lascia un commento