Plugin Depency via Composer im neuen Plugin System

Ich möchte ein Abhängigkeite, die ich über Composer bezogen habe, in meinem Plugin registrieren. Ich habe den vendor-Folder und die autoload.php soweit vorliegen. Laut Doku muss ich nun einfach die autoload requiren/einbinden aber in welcher Methode mach ich das am Besten?

// https://developers.shopware.com/blog/2015/11/11/best-practices-of-shopware-plugin-development/#using-composer
public function registerMyComponents()
{
    require_once $this->Path() . '/vendor/autoload.php';
}

Soll ich dazu die getSubscribeEvents missbrauchen oder gibt es im neuen Plugin-System einen vorgeschriebenen Weg um Abhängigkeit per Composer einzubinden und dann normmal per use zu nutzen? Es gibt eine registerCommands in der Shopware\Components\Plugin-Basisklasse. Überschreiben/Erweitern?

@Shyim‍ macht das bei seinem ShyimProfiler gleich ganz am Anfang der Plugin Hauptklasse:

https://github.com/shyim/shopware-profiler/blob/master/ShyimProfiler.php#L18

Ich denke, dass kann man als „Best Practice“ ansehen :smiley:

Viele Grüße

Japp, kann man :wink: danke. Für den Fall dass die Repo irgendwann mal weg, hier mal als simples Beispiel:
 

// use statements ...

if (file_exists( __DIR__. '/vendor/autoload.php')) {
    require_once __DIR__. '/vendor/autoload.php';
}

class MyPlugin extends Plugin {

    // ...

}

 

Die Vorgehensweise, das Vendor Verzeichnis direkt in der Datei einzubinden verstößt allerdings gegen eine PSR1 Regel:

Ich habe es für mich daher über einen Subscriber gelöst.

pluginPath = $pluginPath;
    }

    /**
     * @return array
     */
    public static function getSubscribedEvents(): array
    {
        return [
            'Enlight_Controller_Front_StartDispatch' => 'onFrontStartDispatch',
            'Shopware_Console_Add_Command' => 'onFrontStartDispatch',
        ];
    }

    /**
     * @noinspection PhpParamsInspection
     * @param EventArgs $args
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function onFrontStartDispatch(/** @noinspection PhpUnusedParameterInspection */ EventArgs $args)
    {
        /** @noinspection PhpIncludeInspection */
        require_once $this->pluginPath . '/vendor/autoload.php';
    }
}

In der services.xml dann:

            %PLUGIN_NAME.plugin_dir%

 

Hallo @hhmarco73‍:

Die Vorgehensweise, das Vendor Verzeichnis direkt in der Datei einzubinden verstößt allerdings gegen eine PSR1 Regel:

Wieso? Es wird doch extra zuvor mit einer if-condition abgefangen. Dazu steht auf der von dir verlinkten Seite:

// conditional declaration is *not* a side effect

=> Es ist kein SideEffect oder etwa doch?

Viele Grüße

“// conditional declaration is *not* a side effect” bedeutet hier m. E., dass im globalen Namensraum erst geprüft wird, ob das Symbol schon vorhanden ist. Hier beim Einbinden des Vendor Verzeichnisses wird ja nur geprüft, ob die Datei vorhanden ist.

Ich denke aber auch, dass da grundsätzlich eher keine Problematik draus entsteht. Und mit Shopware 5.4 wird ja eh alles besser :wink:

Der richtige weg wäre so Added new plugin method registerAutoloader for composer dependencies by shyim · Pull Request #1155 · shopware/shopware · GitHub , jedoch kann das dauern ka wann das gemergt wird :smiley:

M. E. ist das aber auch noch nicht der komplett richtige/optimale Weg. Besser wäre wahrscheinlich, dass hier GitHub - wikimedia/composer-merge-plugin: Merge one or more additional composer.json files at Composer runtime irgend wie in Shopware nutzbar zu machen, wenn wir denn hier von der Installation von Abhängigkeiten via Composer sprechen.

In meinem Fall hab ich einfach nur PhpOffice/Spreadsheet einbinden müssen für ein internes Plugin. Das Paket PhpOffice/Spreadsheet wird nur per Composer bereitgestellt, daher die ursprüngliche Frage). Da es ein internes Plugin ist und nicht an andere weiter gegeben, kann ich an der Stelle den Weg des geringsten Widerstandes gehen. Trotzdem danke für die weiteren Vorschläge.

@hhmarco73‍ schau dir einfach sw 5.4 an  Sticking-out-tongue

@Shyim‍, ich kenne die Optimierung von Shopware 5.4 hinsichtlich Composer;) Und da ich nur einen Shop betreue, bringt mir das höchstwahrscheinlich auch einige Vorteile. Für einen Plugin Hersteller wäre m. E. aber das Composer Merge Tool weiterhin eine gute Sache. 

Und welche?