Framework / architektura

Jak funguje Lemonade Framework.

Lemonade používá společný systém konfigurace, service providerů a dependency injection. HTTP požadavky, konzolové příkazy a úlohy ve frontě zpracovává v oddělených runtime kontextech.

01
Konfigurace a service provideryTypované nastavení a explicitní registrace služeb
02
DI container a registrované službyZmrazený plán pro konzistentní runtime rozlišení
03
Samostatné runtime kontextyIzolovaný stav pro každý konkrétní běhRequestCommandJob
Bootstrap aplikace

Jak se aplikace připravuje

Bootstrap připraví kořenový container pro daný entrypoint: načte typovanou konfiguraci, sestaví plán providerů a dokončí potřebné registry. Nejde ještě o zpracování konkrétního požadavku.

01

Načtení konfigurace

ConfigLoader načte manifestem vybrané definice pro HTTP nebo CLI a uloží je do typovaného registru.

02

Runtime nastavení aplikace

ApplicationBootstrapper doplní cesty, prostředí a debug režim z aktuálního ApplicationContext.

03

Plán providerů

Vznikne společný plán core, entrypoint, frameworkových a aplikačních providerů v pořadí jejich závislostí.

04

Registrace služeb

Metody register() deklarují bindingy, aliasy, lifetimes a tagy. V této fázi se služby ještě nepoužívají.

05

Zmrazení a boot

Container uzavře plán definic a teprve potom spustí boot() providerů pro práci s hotovým runtime containerem.

06

Registry a routing

Routing.php a tagované registrary sestaví a zmrazí tabulku rout. Výběr konkrétní routy probíhá až při HTTP dispatch.

Izolované scopes

Tři runtime kontexty. Společná infrastruktura.

HTTP požadavky, konzolové příkazy a úlohy ve frontě používají služby registrované v aplikaci. Každý typ spuštění má vlastní scope, který odděluje stav konkrétního požadavku, příkazu nebo úlohy.

HTTP runtime

HTTP Request

  • Request scope
  • PSR-7 request
  • Middleware
  • Routing a controllers
CLI runtime

CLI Command

  • Command scope
  • Konzolové příkazy
  • Vstup a výstup
  • Služby používané příkazem
Queue runtime

Queue Job

  • Job scope
  • Zpracování zpráv
  • Handlery
  • Izolace běhu jednotlivých úloh
Aplikační základ

Společně registrované služby

Každý kontext rozlišuje závislosti ze stejného plánu containeru, ale scoped stav ukládá pouze ve svém vlastním scope.

DI container
Konfigurace
Service providery
Databázové služby
Cache
Logging
SingletonJedna instance v root containeru
ScopedJedna instance uvnitř konkrétního scope
TransientNová instance při každém rozlišení
Registrace služby

Provider deklaruje definice během bootstrapu. Runtime služby je následně získávají přes DI container.

app/Providers/AppServiceProvider.php
<?php

namespace App\Providers;

use App\Services\InvoiceImportRegistry;
use Lemonade\Framework\Container\ContainerBuilderInterface;
use Lemonade\Framework\Core\ServiceProviderInterface;

final class AppServiceProvider implements ServiceProviderInterface
{
    public function register(ContainerBuilderInterface $builder): void
    {
        $builder->singleton(
            InvoiceImportRegistry::class,
            InvoiceImportRegistry::class,
        );
    }
}
HTTP lifecycle

Od HTTP požadavku k odpovědi

Běžný požadavek prochází globální PSR-15 pipeline, routováním a zvoleným controllerem. Výsledná odpověď se vrací přes middleware pipeline a kernel ji následně emituje.

01

Request

Kernel předá scope-bound PSR-7 ServerRequest do globální middleware pipeline.

02

Middleware

Globální PSR-15 middleware obalí dispatch a mohou vrátit odpověď ještě před routingem.

03

Router

Router podle HTTP metody a cesty vybere routu a vytvoří neměnný RouteMatch.

04

Controller

Route middleware obalí vybraný handler; resolver sestaví controller a předá argumenty akce.

05

Response

Výsledek akce se normalizuje na PSR-7 odpověď a ResponseEmitter odešle status, hlavičky a tělo.

Odpověď se vrací zpět přes aktivní middleware pipeline
Principy návrhu

Jasné hranice mezi frameworkem a aplikací

Explicitní routing

HTTP metody a cesty jsou mapované na konkrétní controller akce.

Oddělená životnost služeb

Container rozlišuje singleton, transient a scoped služby. Request, Command a Job používají vlastní izolované scopes.

Aplikační odpovědnost

Framework poskytuje infrastrukturu a integrační kontrakty. Aplikace určuje doménovou logiku, strukturu obsahu a konkrétní integrace.