• Czas czytania ~3 min
  • 12.07.2023

Tworzenie aplikacji interfejsu wiersza polecenia może być świetną zabawą. Nie musimy się martwić o interfejs użytkownika i możemy napisać piękny kod PHP, który nie wymaga żadnych kroków budowania.

Podczas budowania aplikacji CLI w PHP nie jesteśmy tak rozpieszczani wyborem, jak w budowaniu aplikacji internetowych - ale jest kilku solidnych konkurentów. Od użycia de facto standardowego komponentu Symfony Console lub dodatkowego pikantnego Laravel Zero. Jednak podczas tworzenia aplikacji CLI możesz chcieć być tak wolny od zależności, jak to tylko możliwe - i tu właśnie pojawia się Minicli. Minicli został wydany jakiś czas temu przez Erikę Heidi jako eksperyment mający na celu zbudowanie wolnego od zależności frameworka CLI, który opierał się na rozszerzeniu linii odczytu PHP jako jedynej zależności.

Spędziłem dużo czasu badając opcje CLI dla projektu, nad którym pracuję. Na początku zacząłem od mojego zwykłego wyboru: Laravel Zero. Jest znany mi i każdemu innemu programiście, który zna Laravel. Potem zacząłem kwestionować aspekt przenośności i wymagać PHP dla osób, które chcą z niego korzystać. To jest do pracy, a nie wszyscy nasi użytkownicy mają zainstalowane PHP. Zanurzyłem się więc w świat języków kompilowanych, patrząc zarówno na GoLang, jak i Rusta. Chociaż nie ma wielu dostępnych opcji, dostępne opcje są doskonałe.

Ostatnio dużo mówi się o natywnym PHP, co zwróciło moją uwagę z powrotem na przestrzeń PHP. Co by było, gdybym mógł zbudować lekką, łatwą w utrzymaniu i przenośną aplikację PHP CLI? Wtedy jeszcze raz przyjrzałem się Minicli. Bawiąc się nim, kiedy po raz pierwszy się pojawił, byłem pod wrażeniem tego, jak miło było używać czegoś wolnego od zależności - ale także jak łatwo było zacząć!

Zalecanym podejściem do tworzenia aplikacji Minicli jest użycie szkieletu aplikacji i kompozytora, aby wszystko skonfigurować i przygotować dla Ciebie.

composer create-project --prefer-dist minicli/application my-awesome-idea

Katalogi powinny być wystarczająco znane dla programistów Laravel, posiadających app katalog i przestrzeń nazw. Zaleca się, aby polecenia, które można tworzyć, były tworzone jako Command Controllerspolecenia oparte na klasach.

Tworzymy przestrzeń nazw poleceń w obszarze , w app/Commandsktórej przechowujesz swoje polecenia.

mkdir app/Commands/LaravelNews

W każdej przestrzeni nazw można dodać wiele poleceń dla różnych odmian. Wnioskuje się, że jeśli nie zostaną przekazane żadne argumenty, będziesz chciał użyć pliku DefaultController. Rzućmy okiem na to, jak utworzyć polecenie.

declare(strict_types=1);

namespace App\Command\LaravelNews;

use Minicli\Command\CommandController;

final class DefaultController extends CommandController
{
    public function handle(): void
    {
        $this->getPrinter()->display("Laravel News rocks");
    }
}

Każdy kontroler poleceń musi być handled i nie musi niczego zwracać - w przeciwieństwie do Symfony lub Laravel Zero, gdzie oczekiwany jest kod zakończenia. Aby wejść w interakcję z wyjściem, otrzymujesz drukarkę - i prosisz ją o wyprowadzenie czegoś.

Jeśli więc chcemy dodać alternatywną wersję - możemy utworzyć kolejny kontroler poleceń w naszej przestrzeni nazw.

declare(strict_types=1);

namespace App\Command\LaravelNews;

use Minicli\Command\CommandController;

final class InfoController extends CommandController
{
    public function handle(): void
    {
        $this->getPrinter()->info("Laravel News rocks");
    }
}

Teraz możemy wywołać nasze polecenie:Które da inny widok domyślnemu poleceniu i możemy użyć następujących innych opcji:

./minicli laravel-news info

display(): A simple text output.
info(): An informative text output.
error(): An error formatted text output.
success(): A success formatted text output.

Każda opcja akceptuje drugi argument jak alt dla alternatywnego wyjścia, które wykona wyjście koloru blokowego z pismem zamiast kolorowego pisania.

Nie jest tak ładny jak coś takiego jak Laravel Zero przy użyciu Termwind - ale czasami nie potrzebujesz ładnego!

Zwykle podczas tworzenia aplikacji CLI chcemy wchodzić w interakcje z interfejsem API innej firmy lub inną usługą w celu wykonania akcji lub logiki. W Minicli odbywa się to poprzez tworzenie usług.

// minicli
$app = new App();
$app->registerService(
    'email',
        new MyEmailImplementation(),
);

Następnie w ramach naszych poleceń możemy pobrać instancję aplikacji i bezpośrednio wywołać naszą usługę:

public function handle(): void
{
    $service = $this->getApp()->email;

    try {
        $service->send(new EmailTemplate());
    } catch (Throwable $exception) {
        $this->getPrinter()->error($exception->getMessage());
    }
}

Mamy więc lekki, potężny framework CLI, który możemy wykorzystać, aby pomóc w naszym przepływie pracy programistycznej - który nie ma zależności, pozwalając nam pisać piękne PHP.

Czy próbowałeś już Minicli? Czy używałeś czegoś podobnego? Daj nam znać na Twitterze!

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297