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.
composer require johnnyxlemonade/framework
php -S 127.0.0.1:8000 -t publicpublic/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.
<?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.
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 pointPří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.
<?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í.
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.
cli:
- CommandsPrvní 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ů.
vendor/bin/lemonade list
vendor/bin/lemonade products:import