Console – Konsola poleceń DbM Framework

Dokumentacja jest stale rozwijana i aktualizowana wraz z postępem projektu. Ponieważ powstaje ona równolegle z kodem, niektóre sekcje mogą tymczasowo odnosić się do wcześniejszych wersji systemu - są one sukcesywnie dostosowywane do bieżącego stanu aplikacji. Jeśli zauważysz nieaktualne informacje, zgłoś to lub załóż Issue / Pull Request.

Dokumentacja

# Console – Konsola poleceń DbM Framework

# Omówienie

Konsola DbM Framework umożliwia uruchamianie poleceń administracyjnych oraz zadań roboczych (workers) bezpośrednio z wiersza poleceń.

# Architektura konsoli:

  • jest lekka i niezależna,
  • inspirowana Artisan (Laravel) oraz Symfony Console,
  • rozdziela Command (zadania użytkowe) i Worker (zadania robocze / batch / cron),
  • obsługuje moduły bez bazy danych.

# Punktem wejścia do konsoli jest plik:

bin/dbm

# Podstawowe użycie

Wyświetlenie pomocy:

php bin/dbm

Wyświetli:

DbM Framework Console
----------
Usage:
  php bin/dbm list
  php bin/dbm command:list
  php bin/dbm worker:list
  php bin/dbm command <name>
  php bin/dbm worker <name>

# Tryby konsoli

list

Wyświetla wszystkie dostępne wpisy konsoli:

php bin/dbm list

command

Służy do uruchamiania poleceń użytkowych.

php bin/dbm command example

Uruchomi klasę:

App\Console\Command\ExampleCommand

worker

Służy do uruchamiania zadań roboczych / batch / cron.

php bin/dbm worker example

Uruchomi klasę:

App\Console\Worker\ExampleWorker

Worker jest uruchamiany z:

  • pomiarem czasu,
  • pomiarem zużycia pamięci,
  • obsługą wyjątków,
  • automatycznym zamknięciem połączeń (np. DB).

# Commands - Polecenia konsoli

# Lokalizacja

src/Console/Command/

# Konwencja nazewnictwa

Plik:

ExampleCommand.php

Klasa:

App\Console\Command\ExampleCommand

# Przykład klasy polecenia

namespace App\Console\Command;

use Dbm\Console\AbstractCommand;

final class ExampleCommand extends AbstractCommand
{
    public function execute(): void
    {
        $this->success('OK!', true);
    }
}

# Uruchomienie:

php bin/dbm command example

# Workers - Zadania robocze

# Lokalizacja

src/Console/Worker/

# Konwencja nazewnictwa

Plik:

ExampleWorker.php

Klasa:

App\Console\Worker\ExampleWorker

# Przykład workera bez bazy danych

namespace App\Console\Worker;

use Dbm\Console\AbstractWorker;

final class ClearCacheWorker extends AbstractWorker
{
    public function run(): void
    {
        $this->log('Cache cleared');
        $this->success('Done', true);
    }
}

# Przykład workera z bazą danych

Jeśli worker wymaga bazy danych, musi zadeklarować to jawnie.

namespace App\Console\Worker;

use Dbm\Console\AbstractWorker;
use Dbm\Database\Contracts\DatabaseInterface;
use Dbm\Database\Contracts\RequiresDatabaseInterface;

final class ExampleWorker extends AbstractWorker implements RequiresDatabaseInterface
{
    public function __construct(
        private readonly DatabaseInterface $database
    ) {}

    public function run(): void
    {
        $users = $this->database->fetchAll(
            'SELECT id, login, email FROM dbm_user'
        );

        foreach ($users as $user) {
            $this->log($user['login']);
        }

        $this->success('Finished successfully');
    }
}

RequiresDatabaseInterface

namespace Dbm\Database\Contracts;

interface RequiresDatabaseInterface {}

To interfejs znacznikowy (marker interface).

# Co robi?

  • informuje konsolę, że worker wymaga bazy danych,
  • powoduje: walidację .env, utworzenie połączenia DB, przekazanie DB do konstruktora workera.

# Worker bez tego interfejsu:

  • nie uruchamia bazy danych,
  • może działać w trybie instalatora lub na plikach.

# Obsługa bazy danych

  • DB jest tworzona tylko wtedy, gdy worker tego wymaga
  • DB_NAME jest opcjonalne: umożliwia moduły bez bazy danych, umożliwia instalatory i migracje
  • brak wymaganych zmiennych środowiskowych skutkuje czytelnym błędem

# Najlepsze praktyki

  • Jeden command / worker = jeden plik
  • Workers: batch, cron, integracje, migracje
  • Commands: narzędzia developerskie, diagnostyka, helpery
  • Jeśli worker używa DB - zawsze RequiresDatabaseInterface
  • Loguj postęp (log()), kończ komunikatem (success())

# Podsumowanie

Konsola DbM Framework:

  • jest szybka i lekka,
  • nie wymaga zewnętrznych bibliotek,
  • obsługuje moduły z DB i bez DB,
  • jasno oddziela logikę infrastruktury od logiki biznesowej.