Composer legt Bundles in lowercase benannten Ordnern ab:
Namespaces möchte man aber in CamelCase (hier: “Acme”) haben:
1 |
namespace Acme\LocaleBundle; |
Was man jetzt wissen muss: Trägt man das Bundle in einen PSR-0-Autoloader ein, dann geht das nicht:
1 2 3 |
"autoload": { "psr-0": { "Acme\\": "deploy/vendor/server" } }, |
, da PSR-0 die Datei unter einem Dateipfad sucht, der dem Namespace entspricht (deploy/vendor/server/Acme/LocaleBundle), “Acme” aber zu “acme” wird. Unter OS X kein Problem, wenn das Dateisystem caseinsensitive ist (scheint der default zu sein? Kann mich da irren), auf einem Server aber schwierig 🙂 Lösung:
1. Lowercase namespaces
Will man nicht.
2. Unterverzeichnisse nutzen
mit
1 2 3 |
"autoload": { "psr-0": { "Symfony\\": "src/" }, }, |
in der composer.json. Kann man machen, bläht aber die Verzeichnis- (und damit die Projekt-) Struktur unnötig auf.
3. Einen eigenen Autoloader schreiben
🙂
4. PSR-4
Kurz vor Redaktionsschluss noch reingekommen: PSR-4 mit
1 2 3 4 5 6 7 8 |
"autoload": { "psr-0": { "": "deploy/src/server/php/", "SymfonyStandard": "deploy/app/" }, "psr-4": { "Acme\\CoreBundle\\": "deploy/vendor/server/acme/CoreBundle", "Acme\\LocaleBundle\\": "deploy/vendor/server/acme/LocaleBundle", ... } } |
Vorteil von PSR-4, wenn ich’s richtig verstanden habe: Die Dateien können irgendwo liegen; der Namespace wird unabhängig vom Verzeichnisbaum nur durch die Angaben im PHP-Code vorgegeben. Empfehlenswert ist aus Übersichtsgründen eine Struktur, die sich trotzdem am Namespace orientiert, aber man muss zumindest auf den Case keine Rücksicht mehr nehmen.