flyokai/symfony-console

Flyokai enhancement of symfony console

Maintainers

Package info

github.com/flyokai/symfony-console

pkg:composer/flyokai/symfony-console

Statistics

Installs: 0

Dependents: 1

Suggesters: 0

Stars: 0

Open Issues: 0

v1.1.0 2026-06-04 17:11 UTC

This package is auto-updated.

Last update: 2026-06-04 18:21:30 UTC


README

User docs → README.md · Agent quick-ref → CLAUDE.md · Agent deep dive → AGENTS.md

Async-friendly Symfony Console for Flyokai — required arguments/options, filesystem validators, and flyokai/generic-based pipelines.

Sits on top of symfony/console and adds a layer of input definitions, handlers, and validators tailored to setup/install/upgrade workflows. Inputs are tunable from across packages so any module can contribute parameters to the same command.

Features

  • RequiredArgument, RequiredOption — extend Symfony with inputRequired, backupValue (Closure), questionAmplifiers
  • DirectoryOption, FileOption — filesystem-aware variants with isWritable, replaceExisting, shouldExist flags
  • Input handlersRequiredArgumentHandler, RequiredOptionHandler, FilesystemOptionHandler
  • Validators — directory, file, existing file, crypt key, URI, HTTP URL, SSL cert, user, selection
  • QuestionFactory — Symfony Question builder with amplifier system
  • State patternInputState is State<InputInterface> from flyokai/generic

Installation

composer require flyokai/symfony-console

Quick start

use Flyokai\SymfonyConsole\InputDefinition\RequiredOption;
use Flyokai\SymfonyConsole\InputDefinition\FileOption;
use Symfony\Component\Console\Input\InputOption;

$definition->addOption(
    new RequiredOption(
        name: 'db-host',
        mode: InputOption::VALUE_REQUIRED,
        description: 'MySQL hostname',
        default: 'localhost',
        inputRequired: true,
    )
);

$definition->addOption(
    new FileOption(
        name: 'crypt-key',
        description: 'Path to the OpenSSL key file',
        shouldExist: true,
    )
);

The matching RequiredOptionHandler / FilesystemOptionHandler does the actual prompting/validation:

  • Interactive mode — prompts the user when the value is missing.
  • --no-interaction — uses backup/default if available, otherwise throws.

Input definitions

Class Extends Adds
RequiredArgument InputArgument inputRequired, backupValue, questionAmplifiers
RequiredOption InputOption same + fluent setBackupValue()
DirectoryOption RequiredOption isWritable
FileOption RequiredOption isWritable, replaceExisting, shouldExist

backupValue may be a Closure(InputInterface): mixed — useful for dynamic defaults derived from other parameters.

Validators

Validator Purpose
DirectoryInputValidator Validate directory paths; create them on demand (interactive); check writability
FileInputValidator Validate file paths; handle replacement/creation with parent dirs
ExistingFileInputValidator Must exist + readable (+ writable if flagged)
CryptKeyValidator Validate cryptographic key files via Flyokai\Misc\CryptKey
UriValidator URI validation with allowed schemes
HttpUrlValidator HTTP(S) URL validation (extends UriValidator)
SslCertValidator SSL certificate validation (extends CryptKeyValidator)
UserValidator Static helpers — validatePassword (8+ chars, no spaces), validateUsername (3+ chars, alnum), validateEmail
SelectionValidator Multi-choice validation against allowed options (lowercased)

QuestionFactory

use Flyokai\SymfonyConsole\QuestionFactory;

$question = QuestionFactory::question('Database name?', amplifiers: [
    'validator'    => fn($v) => $v ?: throw new \InvalidArgumentException('required'),
    'maxAttempts'  => 3,
    'normalizer'   => 'trim',
]);

$confirm = QuestionFactory::confirmation('Continue?', defaultAnswer: false);

Amplifiers (config arrays) include: validator, hidden, hiddenFallback, maxAttempts, multiline, autocompleterCallback, autocompleterValues, normalizer, trimmable.

Tuner pattern

InputState implements Flyokai\Generic\State<InputInterface> so any module can contribute a tuner that mutates the input state as part of a pipeline.

In Flyokai, every setup/install/upgrade parameter is contributed by a separate definition:tuner (adds the option) and input:tuner (validates / collects the value at runtime), wired via DI. See the flyokai/application module documentation for the full setup-command parameter architecture.

Gotchas

  • Validators create files/directories as a side effectFileInputValidator may create the parent directories during validation.
  • Backup value as ClosuregetBackupValue(InputInterface) calls the closure each time; useful for dynamic defaults.
  • Interactive vs. non-interactive — interactive mode loops on validation errors; non-interactive throws immediately.
  • Global error handlerDirectory* / File* validators set a global error handler without nesting protection.
  • SelectionValidator is case-insensitive — input is lowercased; keys are expected lowercase.

See also

License

MIT