Powrót do strony głównej

LOTIS framework PHP: obiekty zamiast DOM i wywołań asynchronicznych

Analiza architektury frameworka LOTIS, zbudowanego w ciągu 10 lat rozwoju. Opisano zasadę CMA (Construct-Metadata-Assembly), zastępującą DOM i asynchroniczne wywołania modelem obiektowym. Podano przykłady kodu z rzeczywistej aplikacji i zalety podejścia dla zadań biznesowych.

LOTIS: PHP bez DOM i Promise — jak to działa?
Advertisement 728x90

# LOTIS: Framework PHP, który zastępuje DOM i asynchroniczne wywołania obiektami

Za dziesięć lat rozwoju autor frameworka LOTIS doszedł do radykalnego rozwiązania: zrezygnować z tagów i asynchronicznych zapytań na rzecz obiektowo-zorientowanego podejścia. Rezultat — tworzenie aplikacji internetowych jako jednolitej całości, bez podziału na klienta i serwer. Zamiast pracy z elementami DOM programiści operują obiektami dziedziny biznesowej, co radykalnie skraca czas na implementację logiki biznesowej.

Koncepcja CMA: od obiektów do metadanych

Podstawą architektury LOTIS jest zasada CMA (Construct-Metadata-Assembly). Aplikacja jest budowana wyłącznie na obiektach implementujących podstawowy interfejs Construct. Każdy obiekt generuje metadane, które są następnie używane do różnych celów: budowania interfejsu, realizacji reaktywności lub tworzenia API. Kluczowy komponent — klasa Space, odpowiedzialna za składanie aplikacji internetowej z obiektów.

W odróżnieniu od tradycyjnych frameworków, gdzie szablon i logika są rozdzielone, LOTIS pozwala:

Google AdInline article slot
  • Opisywać UI za pomocą obiektów PHP
  • Używać tych samych zmiennych po stronie klienta i serwera
  • Unikać ręcznego przetwarzania operacji asynchronicznych
  • Dynamicznie zmieniać hierarchię komponentów poprzez dziedziczenie

Minimalny działający przykład demonstruje istotę podejścia:

$div = LTS::Div()->capt("Hello from LOTIS!");
LTS::Space()->build($div);

Tutaj LTS::Div() tworzy obiekt, a nie znacznik HTML. Przekształcenie w DOM następuje dopiero przy przekazaniu obiektu do Space. Daje to swobodę manipulacji strukturą aplikacji jak w klasycznych frameworkach desktopowych.

Rzeczywisty przypadek: system księgowy „Trekker”

Rozważmy fragment kodu z działającej aplikacji do ewidencji towarów i obliczania wynagrodzeń. LOTIS pozwala opisać skomplikowaną logikę kompaktowo, bez szablonów i wywołań AJAX:

Google AdInline article slot
$maindiv = LTS::DataView();
$maindiv->bindtodb($kassa, [
    'head' => ['sel' => '', 'date' => 'Date'],
    'inputs' => [
        ['name' => 'id',  'type' => 'hidden'],
        ['name' => 'date', 'type' => 'date', 'caption' => 'Date'],
        ['name' => 'save', 'caption' => 'Write', 'type' => 'button'],
        ['name' => 'close', 'caption' => 'Cancel', 'type' => 'button']
    ],
    'cells' => ['save, close', 'date']
]);

$subtable = $maindiv->subtable('kassasubtable', $kassatable, [
    'head' => [
        'sel' => '',
        'name' => 'Employee',
        'pay' => 'Received',
        'del' => ''
    ],
    'inputs' => [
        ['name' => 'user', 'type' => 'table', 'dbtable' => $users, 'caption' => 'Employee'],
        ['name' => 'message', 'caption' => 'Onwartość'],
        ['name' => 'pay', 'type' => 'numeric', 'caption' => 'Issued']
    ]
]);

$maindiv->onsave(function ($args, $result) {
    global $money, $users;
    $paytable = $args['subtables']['kassasubtable'];
    $stock = LTS::Stock($money);
    $stock->collector($users, 'user', ['total' => 'pay']);
    $stock->update(['doc' => $result['data']['id']], $paytable);
    return $result;
});

Zwróć uwagę na przetwarzanie zapisu dokumentu: logika biznesowa (naliczanie wynagrodzeń) jest opisana w jednym bloku bez podziału na części kliencką i serwerową. Haki JavaScript są zintegrowane poprzez metody takie jak table->out(), ale ich pisanie nie wymaga znajomości wzorców asynchronicznych.

Zalety dla programistów

Podejście LOTIS rozwiązuje trzy kluczowe problemy tradycyjnej development internetowej:

  • Eliminacja duplikowania logiki — weryfikacje i przekształcenia danych są opisane raz w obiektach, a nie w oddzielnych modułach JS i PHP
  • Zmniejszenie złożoności architektury — brak potrzeby projektowania API i obsługi stanów ładowania
  • Jednolity model danych — zmiany w obiektach są automatycznie synchronizowane między klientem a serwerem poprzez metadane

Framework jest szczególnie cenny w zadaniach z sztywnymi terminami: typowe operacje (formularze, tabele, walidacja) realizowane są w 3-5 liniach kodu zamiast dziesiątek. Jednocześnie zachowuje elastyczność — poprzez haki JavaScript można dostosować dowolne zachowanie, jak w przykładzie formatowania daty:

Google AdInline article slot
$maindiv->table->out(<<<JS
function (row, obj) {
    row.find('td.Column_date').text(obj.date.substr(0, 10));
}
JS);

Co ważne

  • LOTIS eliminuje granicę klient-serwer dzięki modelowi obiektowemu generującemu metadane
  • Rozwój odbywa się w PHP bez szablonów, ale z możliwością wbudowywania logiki JS
  • Framework oszczędza czas na rutynowych operacjach: AJAX, walidacja, synchronizacja stanów
  • Architektura CMA pozwala używać tych samych obiektów do różnych celów (UI, API, tryb offline)
  • Port na Node.js otwiera drogę dla PWA i aplikacji lokalnych z synchronizacją

Aktualna implementacja frameworka skupia się na aplikacjach biznesowych, gdzie kluczowa jest szybkość development. Następna wersja główna doda wsparcie dla TypeScript i poprawi integrację z nowoczesnymi narzędziami budowania. Dla programistów zmęczonych nieskończonymi wrapperami nad DOM i łańcuchami Promise, LOTIS oferuje powrót do prostoty OOP bez utraty funkcjonalności platformy webowej.

— Editorial Team

Advertisement 728x90

Czytaj dalej