• Час читання ~3 хв
  • 12.07.2023

Створення додатків CLI може бути дуже цікавим. Нам не потрібно турбуватися про інтерфейс користувача, і ми можемо написати гарний PHP-код, який не потребує жодних кроків збірки.

При створенні додатків CLI на PHP ми не так розпещені вибором, як при створенні веб-додатків, але є деякі солідні суперники. Від використання стандартного компонента Symfony Console або надзвичайно пікантного Laravel Zero. Однак, створюючи додаток CLI, ви можете захотіти бути якомога вільнішим від залежностей - саме тут на допомогу приходить Minicli. Minicli був випущений деякий час тому Ерікою Хайді як експеримент зі створення фреймворку CLI без залежностей, який спирався на розширення рядка читання PHP як єдину залежність.

Я витратив багато часу на вивчення варіантів CLI для проекту, над яким працюю. Спочатку я почав зі свого звичайного вибору: Laravel Zero. Це знайоме мені і будь-якому іншому розробнику, який знає Laravel. Потім я почав ставити під сумнів аспект портативності та вимагати PHP для людей, які хочуть ним користуватися. Це для роботи, і не у всіх наших користувачів встановлено PHP. Тому я занурився у світ компільованих мов, дивлячись і на GoLang, і на Rust. Хоча доступно не так багато варіантів, варіанти чудові.

Останнім часом було багато розмов про рідний PHP, що повернуло мою увагу до простору PHP. Що, якби я міг створити легкий, простий в обслуговуванні та портативний додаток PHP CLI? Це було тоді, коли я ще раз поглянув на Minicli. Погравши з ним, коли він вперше вийшов, я був вражений тим, як приємно було використовувати для чогось вільного від залежностей, але також і тим, як легко було почати!

Рекомендований підхід до створення програми Minicli - використовувати скелет програми та композитор, щоб налаштувати все та підготувати для вас.

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

Каталоги повинні бути досить знайомі вам, як розробникам Laravel, мати app каталог і простір імен. Команди, які ви можете створювати, рекомендується будувати як Command Controllers, які є командами на основі класів.

Ми створюємо простір імен команд під , app/Commandsде ви зберігаєте свої команди.

mkdir app/Commands/LaravelNews

Під кожним простором імен можна додати кілька команд для різних варіантів. Випливає, що якщо аргументи не передаються, ви захочете використовувати DefaultController. Давайте розглянемо, як створити команду.

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");
    }
}

Кожен командний контролер повинен бути handled і не повинен нічого повертати - на відміну від Symfony або Laravel Zero, де очікується код виходу. Для взаємодії з виводом ви отримуєте принтер - і просите його вивести щось.

Отже, якщо ми хочемо додати альтернативну версію - ми можемо створити ще один командний контролер в нашому просторі

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");
    }
}

імен.Тепер ми можемо викликати нашу команду:Яка дасть інший вигляд команді за замовчуванням, і ми можемо використовувати наступні інші варіанти:

./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.

Кожен параметр приймає другий аргумент як alt для альтернативного виводу, який зробить вивід блочного кольору з написанням замість кольорового запису.

Це не так красиво, як щось на зразок Laravel Zero, що використовує Termwind - але іноді вам не потрібна гарненька!

Зазвичай при побудові додатку CLI ми хочемо взаємодіяти зі стороннім API або іншим сервісом для виконання дії або логіки. У Minicli це робиться шляхом створення сервісів.

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

Потім у наших командах ми можемо отримати екземпляр програми та безпосередньо зателефонувати до нашої служби:

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

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

Таким чином, у нас є легка, потужна структура CLI, яку ми можемо використовувати, щоб допомогти в нашому робочому процесі розробки - яка не має залежностей, що дозволяють нам писати красивий PHP.

Ви вже пробували Minicli? Ви використовували щось подібне? Повідомте нас у Twitter!

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

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...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297