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