• Время чтения ~3 мин
  • 12.07.2023

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

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

Я потратил много времени на изучение вариантов CLI для проекта, над которым работаю. Сначала я начал со своего обычного выбора: Laravel Zero. Он знаком мне и любому другому разработчику, который знает Laravel. Затем я начал сомневаться в аспекте переносимости и требовать PHP для людей, которые хотят его использовать. Это для работы, и не у всех наших пользователей установлен PHP. Поэтому я погрузился в мир компилируемых языков, посмотрев как на GoLang, так и на Rust. Хотя вариантов не так много, варианты отличные.

В последнее время было много разговоров о нативном PHP, что привлекло мое внимание к пространству PHP. Что, если бы я мог создать легкое, простое в обслуживании и переносимое приложение PHP CLI? Именно тогда я еще раз взглянул на Миникли. Поиграв с ним, когда он только вышел, я был впечатлен тем, как приятно было использовать что-то без зависимостей, но также и тем, как легко было начать!

Рекомендуемый подход к созданию приложения 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? Вы использовали что-нибудь подобное? Расскажите нам об этом в твиттере!

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