psr-0 ClassLoader in Shopware Plugin

So, 07.12.2014 - 18:22 -- Daniel Espendiller

 shopware psr-0 phpMit Einführung der Namespaces in PHP 5.3 und dem psr-0 Standards, hat sich das gesamte Autoloading von PHP Klassen standardisiert (Eine Klasse pro Datei und Verzeichnisstruktur = Namepace). Auch wenn dies mittlerweile durch den psr-4 Standard abgelöst worden ist, so hilft dieses doch immer noch bei der Entwicklung wiederverwendbarer Klassen.
Auch PhpStorm unterstützt das ganze psr-x Thema, so dass Klassen Templates automatisch erzeugt werden. Shopware bietet nur ein Standard ClassLoader ohne psr-0 Support an. Zwar kann man psr-0 recht einfach über einen Spl-Autoloader und ein paar Zeilen Code einbinden einbinden, jedoch sollte man ein require_once nicht nutzen, sonst könnte es sein, dass ein eingereichtes Plugin nicht im Commmunity Store angenommen wird.

Als alternative kann man jedoch den ClassLoader vom Doctrine Projekt einbinden \Doctrine\Common\ClassLoader, dieser Unterstützt psr-0 und ist in Shopware als vendor Library eingebunden. Dazu reicht es dann in der Boostrap Datei über die init Funktion einen Loader zu definieren. Hier nehmen wir einfach mal einen Order "PluginName/src" diesem geben wir dann dem Namespace "espend". Dazu die Datei Beispiele:

ClassLoader einbinden

class Shopware_Plugins_Frontend_EspendTest_Bootstrap extends Shopware_Components_Plugin_Bootstrap {
 
    public function afterInit()
    {
        $loader = new \Doctrine\Common\ClassLoader('espend', __DIR__ . '/src');
        $loader->register();
    }
 
}

psr-0 Namespace ClassLoader

Der Doctrine ClassLoader sucht anhand des Verzeichnis src nun entsprechende Dateien anhand der Namensräume und Klassennamen.

# EspendTest/src/espend/MyClass.php
namespace espend;
 
class MyClass {
 
}

Shopware ClassLoader

Wer will kann auch den Standard Loader von Shopware nutzen. Dazu werden die Klassennamen aber bei mehreren Unterverzeichnissen schnell recht lang.

# EspendTest/Classes/FooClass.php
class Shopware_Plugins_Frontend_EspendTest_Classes_FooClass {
}