2016-06-30 10 views
1

Ich habe mein Bestes getan, um eine Frage/Antwort zu finden, die zutrifft, aber ich glaube nicht, dass ich genug über den Autoloader verstehe, um eine passende Antwort zu erkennen.First Composer Paket - Autoloader funktioniert nicht

Ich habe ein Paket mit dem folgenden composer.json:

{ 
    "name": "Pva_agent", 
    "type":"library", 
    "description" : "query the pva agent", 
    "version":"0.1b", 
    "authors" : [ 
     { 
      "name":"Ed Greenberg", 
      "email":"[email protected]" 
     } 
    ], 
    "minimum-stability":"dev", 
    "require": {}, 
    "autoload": { 
     "psr-0": { 
      "Pva_agent": "." 
     } 
    } 

} 

Meine Verzeichnisstruktur nach Komponist Installation des Pakets:

. 
./vendor 
./vendor/autoload.php 
./vendor/Pva_agent 
./vendor/Pva_agent/Agent.php 
./vendor/Pva_agent/composer.json 
./vendor/Pva_agent/.gitignore 
./vendor/composer 
./vendor/composer/autoload_psr4.php 
./vendor/composer/autoload_real.php 
./vendor/composer/autoload_classmap.php 
./vendor/composer/autoload_namespaces.php 
./vendor/composer/installed.json 
./vendor/composer/autoload_static.php 
./vendor/composer/ClassLoader.php 
./vendor/composer/LICENSE 
./composer.lock 
./composer.json 
./test_pva_agent.php 

Mein Testprogramm:

<?php 
require_once('vendor/autoload.php'); 

use Pva_agent\Agent; 

$agent = new Agent(); 

Mein Ergebnis:

[email protected] pva_project $ php test_pva_agent.php 
PHP Fatal error: Class 'Pva_agent\Agent' not found in /home/edg/PhpstormProjects/pva_project/test_pva_agent.php on line 6 
PHP Stack trace: 
PHP 1. {main}() /home/edg/PhpstormProjects/pva_project/test_pva_agent.php:0 
[email protected] pva_project $ 

Ich dachte nicht, dass ich die Anweisung 'verwenden' brauchte, da der Autoloader die Klasse finden sollte, oder?

Kann mir jemand sagen, wo das Problem liegt?

Danke,

Ed Green

Antwort

0

Ihre Pva_agent Bibliothek sollte im vendor/ Verzeichnis nicht sitzen. Dieses Verzeichnis sollte nur automatisch generierte Daten von Composer enthalten. Dieses Verzeichnis wird normalerweise nicht in VCS gespeichert.

sollten Sie prüfen, die Verzeichnisstruktur, um etwas ähnlich wie diese Refactoring:

. 
|____composer.json 
|____composer.lock 
|____src 
| |____Pva_agent 
|____vendor 

Ihre Bibliothek Funktionalität src/Pva_agent Verzeichnis hinzugefügt werden soll.

Sie sollten PSR-4 anstelle von PSR-0 für autoload verwenden, da der Autoloader beim Hinzufügen von Klassen nicht neu generiert werden muss. dump-autoloader muss im Fall von PSR-0 nach dem Hinzufügen von Classifieds ausgeführt werden.

Für die Verzeichnisstruktur oben und der PSR-4 Autoloader Ihre composer.json automatisch geladen Abschnitt auf diese wie folgt aussehen sollte:

"autoload": { 
    "psr-4": { "Pva_agent\\": "src/Pva_agent" } 
} 

Ihre Bibliothek sollte Auto danach geladen werden. Ihre automatisch geladene Bibliothek wird unter dem Namespace Pva_agent registriert.

+0

Hmmm ... Danke, Lukas, aber deine Antwort erzeugt mehr Fragen :) Composer legte meine Bibliothek unter den Anbieter, so wie es alles, was ich aus dem Internet bekommen würde, setzen würde. –

+0

Composer sollte Ihren Quelltext nicht unter dem 'vendor /' platzieren. Wenn Sie in den 'vendor /' Ordner einsteigen, sollten Sie den Pfad zu Ihrer Bibliothek in der Liste sehen: 'vendor/composer/autoload_psr4.php'. Sie können eine Struktur meiner [PhiKettle-Bibliothek] (https://github.com/loftdigital/PhiKettle) als ein Beispiel überprüfen. Versuchen Sie, das Projekt zu klonen und 'Composer Update' auszuführen. –