Instalace a CLI

Framework má vlastní CLI runtime a registr příkazů. HTTP i CLI bootstrap načítají sdílenou konfiguraci a service providery.

Instalace

Composer přidá framework do aplikace s PHP 8.3–8.5 a rozšířeními fileinfo, mbstring a xmlwriter. Druhý příkaz spustí vestavěný PHP server nad public/; funguje až po vytvoření HTTP entrypointu v dalším kroku.

Terminal
composer require johnnyxlemonade/framework
php -S 127.0.0.1:8000 -t public

public/index.php načte autoloader, vytvoří ApplicationContext z kořenového adresáře projektu a předá jej KernelFactory. handle() pak zpracuje aktuální HTTP požadavek.

public/index.php
<?php

declare(strict_types=1);

use Lemonade\Framework\Core\Context\ApplicationContextFactory;
use Lemonade\Framework\Core\KernelFactory;

require dirname(__DIR__) . '/vendor/autoload.php';

$context = (new ApplicationContextFactory())->fromGlobals(dirname(__DIR__));
$kernel = (new KernelFactory())->create($context);
$kernel->handle();

Struktura aplikace

Strom odděluje konfiguraci, routy, controllery a views v app/ od vstupních bodů. public/index.php obsluhuje HTTP; vendor/bin/lemonade spouští CLI příkazy. Oba načítají aplikační konfiguraci, ale CLI manifest může zahrnout jiné moduly.

Application tree
app/
├── Config/          # YAML configuration and Routing.php
├── Controllers/     # HTTP actions
├── Language/        # translation catalogs
├── Providers/       # application service bindings
└── Views/           # layouts, pages and partials
public/index.php      # HTTP entry point
storage/              # cache, logs and sessions
vendor/bin/lemonade   # CLI entry point

Příkaz a jeho registrace

ImportProductsCommand implementuje CommandInterface. run() dostane argumenty za názvem příkazu, vypíše jejich počet přes CommandOutput a vrátí procesní exit code. Jde o kostru příkazu; produkty neimportuje. Registrace názvu a popisu následuje v Commands.yaml.

app/Console/ImportProductsCommand.php
<?php

declare(strict_types=1);

namespace App\Console;

use Lemonade\Framework\Cli\CommandInterface;
use Lemonade\Framework\Cli\CommandOutput;

final readonly class ImportProductsCommand implements CommandInterface
{
    public function __construct(private CommandOutput $output) {}

    public function name(): string { return 'products:import'; }
    public function description(): string { return 'Inspect product import arguments.'; }

    public function run(array $args): int
    {
        $this->output->writeln('Arguments: ' . count($args));
        return 0;
    }
}

Commands.yaml spojuje jméno products:import s třídou příkazu a popisem pro list/help. Definice dovolí registraci bez vytvoření příkazu; instance vznikne až při jeho spuštění.

app/Config/Commands.yaml
module: commands
config:
  commands:
    - name: products:import
      class: App\Console\ImportProductsCommand
      description: Inspect product import arguments.

Tato část manifestu Config.yaml zařadí Commands.yaml pouze do CLI bootstrapu. Bez ní se definice products:import nenačte, i když soubor s třídou existuje.

app/Config/Config.yaml
cli:
  - Commands

První příkaz vypíše dostupné definice. Druhý vyřeší ImportProductsCommand v Command scope, zavolá run() a v tomto příkladu vypíše počet předaných argumentů.

Terminal
vendor/bin/lemonade list
vendor/bin/lemonade products:import
Související dokumentaceVíce informací najdete v kapitole CLI a cron v dokumentaci.

← Všechny ukázky