Plugin

Mit Plugins kann die Funktionsweise der Anwendung erweitert werden. Plugins müssen als Phar-Archive

Installation

In der Datei system.ini muss die IncludeApplicationPlugins Einheit aktiviert werden. Dies kann über folgenden Codeblock erfolgen.

; Plugins einbinden
IncludeApplicationPlugins=*

[IncludeApplicationPlugins]
; Konfiguration für das Einbinden von Plugins

Verwalten von Plugins

Auf der Konsole stehen Befehle zum Hinzufügen, Aktivieren, Deaktivieren und Löschen eines Plugins zur Verfügung.

Hinweis

Der Parameter --version ist nur notwendig, wenn mehrere Versionen eines Plugins installiert sind.

Hinzufügen

Plugins können entweder im Dateisystem liegen oder über eine URL von einem externen Webserver geladen werden. Dazu kommt der Befehl plugin:fetch zum Einsatz. Das Plugin wird im Plugin-Verzeichnis available/<version>/<plugin-phar> available/<version>/<plugin-phar-pubkey> abgelegt. Nach diesem Befehl ist das Plugin noch nicht aktiviert und hat weiter keine Funktion.

# Plugin liegt in einem Verzeichnis im Dateisystem
alvine-platform plugin:fetch \
            --source /tmp/hello-world.phar

# Plugin über URL von entfernten Webserver holen
alvine-platform plugin:fetch \
            --source https://example.com/hello-world.phar

Hinweis

Unter der angegebenen Quelle muss auch der öffentliche Schlüssel liegen. Wird das Plugin https://example.com/hello-world.phar geholt, so wird auch die Datei https://example.com/hello-world.phar.pubkey geladen.

Aktivieren

Ein vorhandenes Plugin kann über plugin:enable aktiviert werden. Nach dem Aufruf dieses Befehls wird beim nächsten Aufruf der Anwendung das Plugin eingebunden.

# Im Verzeichnis
alvine-platform plugin:enable \
            --class \\My\\Plugin\\Component

Da der Backslash in vielen Konsolen ein Sonderzeichen ist, muss statt --class \My\Plugin\Component der Backshlash maskiert werden: --class \\My\\Plugin\\Component

Hinweis

Liegt das Plugin in mehreren Versionen vor, so muss die Version mitgegeben werden:

# Im Verzeichnis
alvine-platform plugin:enable \
            --class \\My\\Plugin\\Component
            --version 1.1.0

Deaktivieren

Ein vorhandenes Plugin kann über plugin:disable deaktiviert werden.

# Im Verzeichnis
alvine-platform plugin:disable \
            --class \\My\\Plugin\\Component

Ab jetzt wird das Plugin nicht mehr verwendet. Das Pluginpaket ist aber noch verfügbar und kann über plugin:enable aktiviert werden.

Löschen

Ein vorhandenes, nicht aktives Plugin, kann über plugin:remove von der Festplatte gelöscht werden.

# Im Verzeichnis
alvine-platform plugin:remove \
            --class \\My\\Plugin\\Component

Liegt das Plugin in mehreren Versionen vor, so muss die Version mitgegeben werden:

# Im Verzeichnis
alvine-platform plugin:remove \
            --class \\My\\Plugin\\Component
            --version 1.1.0

Um das Plugin wieder zu aktivieren, muss es mit plugin:fetch neu geholt werden.

Entwicklung

Plugins müssen im Format Phar ausgeliefert werden. Die Grundstruktur innerhalb des Phars ist folgendermassen:

├── default
│   ├── component.properties
│   └── route
│       └── myplugin-route.xml
├── resource
│   └── locale
│       ├── en.properties
│       └── de.properties
├── source
│   ├── Component.class.php
│   └── Presenter.class.php
└── web

Im Stub des Plugins muss der Namespace registriert werden.

<?php
namespace Alvine\Application\Platform\Plugin\HelloWorld;
\Alvine\Core\ComponentLoader::getInstance()->registerNamespace(__NAMESPACE__, 'phar://hello-world-snapshot.phar/source/');
__HALT_COMPILER(); ?>

Alle Plugins müssen im Source-Verzeichnis eine von \Alvine\Application\Platform\Plugin\Component abgeleitete Klasse Component besitzen.

Übersicht über die logische Pluginstruktur:

Aktivieren & Deaktivieren

Müssen Plugins weitere Konfigurationen durchführen, so können die Methoden enable() und disable() überschrieben werden.

Im Standardverhalten der Methode enable() werden alle Webdateien aus dem Verzeichnis web in das Anwendungswebverzeichnis vendor/plugins/<name des plugins> kopiert. Alle Routen werden in das Routingverzeichnis kopiert.

Die Standardmethode disable() entfernt diese Dateien wieder.

Abhängigkeiten

Abhängigkeiten, bestimmte PHP-Version, PHP-Module oder andere Komponenten müssen über die Methode Component::initEnvironmentRules() definiert werden.

protected function initEnvironmentRules(): \Alvine\Core\Component {
    parent::initEnvironmentRules();

    $this->ruleset->add(new \Alvine\Util\Dependency\Rule\PhpIni('zend.multibyte', true))
        ->add(new \Alvine\Util\Dependency\Rule\Component('myplugin', '1.0.0'))
        ->add(new \Alvine\Util\Dependency\Rule\PhpModule('mbstring'));
}

Konfigurationen

Die Standardwerte der Konfigurationseinstellungen stehen in der Datei default/component.properties. Die Konfiguration innerhalb des Plugins muss über Component::getConfiguration() geladen werden.

Regeln

Plugins dürfen

  • Plugincode ausführen
  • Plugins dürfen Komponenten aktivieren (über Assembly::includeLibrary())
  • Dürfen auf Plattform-Klassen/Objekte zugreifen.
  • Dürfen Plattformcode verwenden

Dürfen nicht

  • Plugins dürfen andere Plugins nicht einbinden
  • Plugins dürfen keine Komponente (Phar) direkt einbinden, sondern müssen über Assembly::includeLibrary() gehen.

Anpassungen

Anpassungen an Plugindateien können über das Customisation-Verzeichnis der Anwendung durchgeführt werden. Anpassungen müssen im Verzeichnis plugins/<name des plugins>/ liegen.