Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

Commands mit Argumenten und Optionen

Commands mit Argumenten und Optionen

~14 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026

Ein fest verdrahteter Command reicht selten – dieses Kapitel macht unseren überfälligen-Aufgaben-Command KONFIGURIERBAR: ein Projekt-Filter als Argument, ein "nur zählen"-Modus als Option.

Argumente vs. Optionen: der Unterschied

TypEigenschaften
ArgumentPFLICHT (sofern kein Default gesetzt), POSITIONSABHÄNGIG – app:command wert.
OptionIMMER optional, NAMENTLICH referenziert, unabhängig von der Reihenfolge – app:command --option=wert oder --option als reiner An/Aus-Schalter.

Ein Argument hinzufügen: Projekt-Filter

src/Command/ListUeberfaelligeAufgabenCommand.php
use Symfony\Component\Console\Attribute\Argument;
use App\Repository\ProjectRepository;

// ... Klassen-Attribut und Constructor wie in Kapitel 39, ProjectRepository zusätzlich injiziert ...

protected function execute(
    InputInterface $input,
    OutputInterface $output,
    #[Argument(description: 'Optionale Projekt-ID zum Filtern')]
    ?int $projektId = null,
): int {
    $io = new SymfonyStyle($input, $output);

    if ($projektId !== null) {
        $projekt = $this->projectRepository->find($projektId);
        if ($projekt === null) {
            $io->error(sprintf('Projekt mit ID %d nicht gefunden.', $projektId));

            return Command::FAILURE;
        }
    }

    // ... restliche Logik wie in Kapitel 39 ...
}

Die MODERNE Syntax (Symfony 7.1+): #[Argument] DIREKT auf dem Methoden-Parameter, mit Standard-PHP-Typisierung (?int für optional). Symfony übernimmt Parsing und Typ-Konvertierung AUTOMATISCH – kein manuelles $input->getArgument('project-id') plus (int)-Cast mehr nötig, wie es die ältere Syntax verlangte.

Eine Option hinzufügen: nur zählen

use Symfony\Component\Console\Attribute\Option;

protected function execute(
    InputInterface $input,
    OutputInterface $output,
    #[Argument(description: 'Optionale Projekt-ID zum Filtern')]
    ?int $projektId = null,
    #[Option(description: 'Nur die Anzahl ausgeben, keine Details')]
    bool $nurZaehlen = false,
): int {
    // ...
    if ($nurZaehlen) {
        $io->writeln((string) count($aufgaben));

        return Command::SUCCESS;
    }
    // ... normale Ausgabe wie zuvor ...
}

Der Command mit Argumenten/Optionen aufrufen

php bin/console app:list-overdue-tasks           # alle Projekte
php bin/console app:list-overdue-tasks 3         # nur Projekt-ID 3
php bin/console app:list-overdue-tasks --nur-zaehlen
php bin/console app:list-overdue-tasks 3 --nur-zaehlen

Interaktive Nachfragen bei fehlenden Pflichtangaben

if ($io->confirm('Wirklich alle überfälligen Aufgaben als erledigt markieren?', false)) {
    // ... Aufgaben aktualisieren ...
}

$antwort = $io->ask('Neuer Status für alle gefundenen Aufgaben', 'in_arbeit');

confirm() fragt eine Ja/Nein-Bestätigung ab (mit Default-Wert als zweitem Argument), ask() fragt freien Text ab – beide pausieren die Ausführung, bis der Nutzer im Terminal antwortet. NÜTZLICH für interaktive Nutzung, aber problematisch für AUTOMATISIERTE Skripte.

Achtung: Interaktive Abfragen BLOCKIEREN in automatisierten Kontexten (Cron-Jobs, CI/CD, Kapitel 41) unbegrenzt, da NIEMAND antworten kann – Symfony bietet dafür das --no-interaction-Flag (auch -n), das ALLE interaktiven Abfragen automatisch mit ihrem Default-Wert beantwortet. Commands, die auch automatisiert laufen sollen, MÜSSEN mit --no-interaction funktionieren.

Hilfe zu einem Command anzeigen

php bin/console app:list-overdue-tasks --help

Tipp: --help zeigt AUTOMATISCH generierte Dokumentation zu ALLEN Argumenten und Optionen, inklusive der description-Texte aus den Attributen – ein weiterer Grund, DIESE stets sinnvoll zu formulieren, statt sie leer zu lassen.