Skip to content
Some more symfony for oxid
PHP
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src
.gitignore
LICENSE
README.md
composer.json

README.md

OxidKernel

Liste der Module die den Kernel verwenden

Installation

Falls nicht schon gesehen, installiere Composer auf deinen Rechner. Öffne die Konsole im Root von Oxid und führe folgenden Befehl aus:

composer require oxid-community/symfony-kernel

Modul aktivieren

Aktiviere das Modul Symfony Kernel im Backend unter Erweiterungen > Module.

Modul Reihenfolge

Damit Kernel funktioniert musst die Ladereihenfolge korrekt eingerichtet sein. Öffne den Tap Installierte Shop-Module unter Erweiterungen > Module und suche den Eintrag OxidCommunity\SymfonyKernel\Legacy\Core\ShopControl. Sollten noch weitere \ShopControl Einträge vorhanden sein, verschiebe OxidCommunity\SymfonyKernel\Legacy\Core\ShopControl an das Ende der ShopControl-Liste.

Tip: Mit STRG + F (CMD + F für Mac) kann ShopControl besser gesucht werden.

Mögliche Probleme

Falsch benannte Klassennamen. Es kann durchaus passieren, dass Module die Klasse ShopControl klein schreiben, oder gänzlich unterschiedlich benannt haben. Auch diese Klassen müssen in der Ladereihenfolge vor dem Kernel positioniert werden.

Nach installation eines Modules läuft Oxid Kernel nicht mehr. Denn dass neue Modul nutzt vermutlich auch die Klasse ShopControl und die Ladereihenfolge muss angepasst werden.

Hinweis: Eine automatische Ladereihenfolge steht auf der Todo-Liste.

Was kannst du damit tun?

Alles was Symfony bietet, oder zumindest alles, was die Symfony-Version von Oxid bietet. Die meisten Symfony 3 Komponenten sollten funktionieren, versuche aber bitte nicht, die Oxid-Tabellen mit Entities zu nutzen. Das Oxid-Framework sollte weitgehends verwendet werden, um Daten zu verarbeiten oder zu formatieren. Die machen das schon ganz gut. OxidKernel hat erst dann einen Vorteil, wenn es um Komminikation mit anderen Systemen etc. geht, oder du mit Komposer bestehende Bundles hinzufügen möchtest.

Beispiel

Das Modul sioweb/oxid-api basiert auf diesem OxidKernel und fügt eine REST-API hinzu, mit der Daten aus Oxid abgegriffen werden können. OxidKernel wird automatisch installiert, wenn composer req sioweb/oxid-api ausgeführt wird.

Symfony-Bundles & Routen in Oxid

Um Bundles automatisch für Oxid zu registrieren, muss folgende Extra-Eigenschaft in der composer.json des Bundles hinterlegt werden. Damit müssen Benutzer das Bundle nicht erst von Hand in eine Datei schreiben. Es ist unbedingt notwendig, der Bundle-Klasse einen uniquen Namen zu geben, daher bitte wie folgt ausschreiben. Das API-Bundle nutzt beispielsweise SiowebOxidApiBundle.php.

"extra": {
    "oxid-kernel-plugin": "Your\\Namespace\\PluginName\\YourNamespacePluginNameBundle"
}

Bitte Your\\Namespace durch den eigenen Namespace ersetzen. Die Verzeichnis-Struktur sollte wie folgt aussehen:

  • ROOT/
    • src/
      • Resources/
        • config*
          • [routing|listener|services].yml
        • oxid
          • Module Article.php
          • views/
          • metadata.php
      • YourNamespacePluginNameBundle.php
    • composer.json
    • README.md

In der composer.json kann dann angegeben werden, dass die Daten unter src/Resources/oxid/ in das Module-Verzeichnis von Oxid installiert werden soll. Alle Namespaces die in den Module-Ordner kopiert werden, sollten als Namespace-Zusatz Legacy erhalten. Im API-Bundle lautet der Namespace beispielsweise Sioweb\Oxid\Api\Legacy\, gefolgt von der Ordnerstruktur nach PSR-4.

"extra": {
    "oxideshop": {
        "source-directory": "./src/Resources/oxid",
        "target-directory": "VENDOR NAME/PLUGIN NAME"
    },
    "oxid-kernel-plugin": "Your\\Namespace\\PluginName\\YourNamespacePluginNameBundle"
},
"autoload": {
    "psr-4": {
        "Your\\Namespace\\PluginName\\Legacy\\": "../../../source/modules/VENDOR NAME/PLUGIN NAME/",
        "Your\\Namespace\\PluginName\\": "src/"
    },
    "exclude-from-classmap": [
        "src/Resources/oxid"
    ]
}

In der Datei Plugin.php können Routen und Konfigurationen geladen werden.

Ein Modul benötigt weitere Bundles

Dazu müssen alle Bundles im Requirement-Block geladen werden. Anschließend müssen mehrere oxid-kernel-plugin hinterlegt werden. Hier ein Beispiel mit Twig:

"extra": {
    "oxideshop": {
        "source-directory": "./src/Resources/oxid",
        "target-directory": "VENDOR NAME/PLUGIN NAME"
    },
    "oxid-kernel-plugin": {
        "eigener/paketname": "Your\\Namespace\\PluginName\\YourNamespacePluginNameBundle",
        "twig": "Symfony\\Bundle\\TwigBundle\\TwigBundle"
    }
}

Wichtig ist, dass die Werte "eigener/paketname" und "twig" eindeutig bzw. unique sind. Pakate die später geladen werden, können die Einstellungen überschreiben und eigene Klassen an dieser Stelle laden.

Stand-Alone ohen Oxid

Der Kernel ist auch gänzlich ohne Oxid nutzbar. Sollte ein Modul den Kernel, aber nicht zwingend Oxid benötigen, kann das Modul mit composer create-project vendor/modul installiert werden. Das Modulö benötigt den Parameter oxid-kernel-plugin und folgende Scripts:

"scripts": {
    "post-install-cmd": [
      "OxidCommunity\\SymfonyKernel\\Composer\\Plugin::registrateRootPlugin"
    ],
    "post-update-cmd": [
      "OxidCommunity\\SymfonyKernel\\Composer\\Plugin::registrateRootPlugin"
    ]
}

Configuration

Die Config wird weitgehends automatisch eingerichtet. Nach der Installation wird im Root des Shops das Verzeichnis /kernel/ angelegt. Hier können dann die Symfony-Typischen Configs etc. verwendet werden.

parameters.yml & Datenbank?!

Die Datei parameters.yml wird automatisch unter /kernel/config/parameters.yml eingerichtet. Sämtliche Einstellungen aus /source/config.inc.php werden in lowercase übernommen und gespeichert.

Datenbank-Parameter werden automatisch in Symfonykonforme Namen umgewandelt.

Eigene Configs?

Unter /kernel/config/ kann die Datei config_prod.yml angelegt werden. OxidKernel lädt diese dann nach. Später wird vermutlich auch eine config_dev.yml möglich sein. Bis auf weiteres, gibt es allerdings nur die 'prod'-Environment.

Aber was ist mit den Oxid-Routen?

OxidKernel wird den regulären Betrieb nicht stören. Ein Eventlistener prüft zunächst, ob eine Route überhaupt in einer YAML-Datei hinterlegt wurde und ob diese geladen werden kann. Sollte die Route nicht gefunden werden, wird Oxid alles weitere Überlassen. Daher würde ich vorschlagen, dass die Routen sich besser nicht mit den Kategorien in Oxid überschneiden.

You can’t perform that action at this time.