Cover Image

Seit Version 1.72.0 gibt es die Möglichkeit Kommandos oder Konfigurationen als Modul zu veröffentlichen. Module bieten eine einfache Möglichkeit Konfiguration und Kommandos direkt in einem Projekt oder einem Entwickler-Team zu teilen ohne, dass zuerst eine Konfiguration angepasst werden muss.

Module Struktur

Ein Modul besteht in seiner einfachsten Form aus einem Verzeichnis und einer Konfigurationsdatei mit dem Namen n98-magerun.yaml. Die Konfigurationsdatei muss direkt im Modulverzeichnis liegen. Innerhalb der Konfigurationsdatei könnt ihr bestehende Konfigurationen ändern, oder neue hinzufügen. Also eigentlich nichts neues. Der Vorteil der Module ist aber, dass n98-magerun innerhalb von definierten Modul-Basisverzeichnissen nach den entsprechenden Modulen sucht.

Beispiel n98-magerun.yaml:

autoloaders:
  MyNamespace: %module%/src

commands:
  customCommands:
    - MyNamespace\FooCommand
    - MyNamespace\BarCommand

Der Platzhalter %module% wird durch den absoluten Pfad des Moduls ersetzt. Es ist nicht Möglich innerhalb eines Moduls ein anderes zu platzieren. Wir registrieren hier einen eigenen PHP Namespace im n98-magerun Autoloader und sagen diesem wo sich der Quellcode befindet. In diesem Fall das Verzeichnis

src
└── test-module 
    ├── n98-magerun.yaml 
    └── src 
        └── MyNamespace 
            ├── BarCommand.php 
            └── FooCommand.php

Beispiel Kommando:

<?php

namespace MyNamespace;

use N98\Magento\Command\AbstractMagentoCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class FooCommand extends AbstractMagentoCommand
{
    protected function configure()
    {
        $this
            ->setName('mynamespace:foo')
            ->setDescription('Test command registered in a module')
        ;
    }

    /**
     * @param \Symfony\Component\Console\Input\InputInterface $input
     * @param \Symfony\Component\Console\Output\OutputInterface $output
     * @return int|void
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->detectMagento($output);
        if ($this->initMagento()) {
        // .. do something 
        }
    }
}

Wo werden die Module abgelegt?

Momentan sind drei Verzeichnisse für die Module vorgesehen. Ein globales, eines für den Benutzer und eines innerhalb eines Projekts. Damit bleibt man auch bei der Nutzung von Modulen flexibel.

  • /usr/local/share/n98-magerun/modules
  • ~/.n98-magerun/modules
  • MAGENTO_ROOT/lib/n98-magerun/modules

Die Reihenfolge der Konfigurationsverarbeitung ist nun wie folgt:

  • [DIST] config.yaml innerhalb der phar Datei
  • [Module] Module in der oben genannten Reihenfolge
  • [System] Konfiguration aus /etc/n98-magerun.yaml
  • [Benutzer] ~/n98-magerun.yaml
  • [Projekt] MAGENTO_ROOT/app/etc/n98-magerun.yaml

Tipp: n98-magerun Kommandos direkt in ein Magento-Modul integrieren

Durch das neue Modulverzeichnis unter lib/n98-magerun/modules kann ein n98-magerun-Modul direkt mit einem Magento-Modul ausgeliefert werden.

Beispiel Magento Modul “My_Foo”:

├── app
│   ├── code
│   │   └── local
│   │       └── My
│   │           └── Foo
│   │               └── etc
│   │                   └── config.xml
│   └── etc
│       └── modules
│           └── My_Foo.xml
└── lib
    └── n98-magerun
        └── modules
            └── my-foo
                └── n98-magerun.yaml

Das n98-magerun Kommando kann auch ganz normal über z.B. modman registriert werden. Auch die Installation über Composer mit dem Magento-Composer-Installer ist damit möglich.

Fazit:

Das neue Modul-System bietet die Möglichkeit schnell Module auszutauschen. Damit ist es möglich sich ein eigenes Ökosystem auf Basis von n98-magerun zu schaffen.