原文地址:How to build a Command Line Application using PHP?
如果你是一名Web開發工程師,那麼你一定使用PHP開發過很多Web應用程序。但是你知道如何使用PHP快速構建一個命令行應用程序(工具)嗎?下面我將向您展示如何使用PHP和一個著名的的Composer擴展包--Symphony/Console構建一個命令行應用。
Symphony/Console是一個使用Composer管理的PHP擴展包,它簡化了創建一個漂亮的、可測試的PHP命令行應用的過程,它提供了開箱即用的諸如(可選/必選的)參數規範和選項規範(使用-符號)等功能。那麼,我們來一起開始構建我們的應用。
按照慣例,我們將構建一個“Hello World”的控制枱應用程序,但是要稍微修改一下它,讓它支持自定義問候語(代替Hello),並且可以隨意的去問候一個人(代替world)。
這個Hello World應用程序將會有如下功能:
- 為我們提供一個單獨的
greet(問候)命令,我們將使用它來與應用程序交互。 greet可以接受一個可選的參數(name)來打印出一個被問候的人(默認是World)。greet可以接受一個選項(--say)來更改問候語(默認是Hello)。- 如果我們麼樣給定參數或者選項,程序將默認輸出一個
Hello World消息。
如何使用PHP構建命令行應用程序
-
為我們的項目創建新的目錄並
cd進入它:mkdir hello-world-app && cd hello-world-app -
使用Composer將控制枱組件引入我們項目
composer require symfony/console -
然後為你的應用程序創建一個入口點,PHP擴展不是必需的,因為我們要使這個文件成為可執行文件,並在文件本身中指定環境。
touch HelloWorld chmod +X HelloWorld -
將下面的代碼添加到
HelloWorld文件中(後面我將為每一行做註解),並在你的終端中執行HelloWorld這個應用程序.#!/usr/bin/env php <?php require __DIR__.'/vendor/autoload.php'; use Symfony\Component\Console\Application; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; (new Application('Hello World', '1.0.0')) ->register('greet') ->addArgument('name', InputArgument::OPTIONAL, 'Name of the person') ->addOption('say', null, InputOption::VALUE_REQUIRED, 'Custom greeting') ->setCode(function (InputInterface $input, OutputInterface $output) { $name = $input->getArgument('name'); $greeting = $input->getOption('say'); if (!empty($name) && !empty($greeting)) { return $output->writeln("<info>$greeting $name!</info>"); } else if (!empty($name)) { return $output->writeln("<info>Hello $name!</info>"); } else if (!empty($greeting)) { return $output->writeln("<info>$greeting World!</info>"); } else { return $output->writeln("<info>Hello World!</info>"); } }) ->getApplication() ->run();
看,就這樣,你擁有了自己的HelloWorld控制枱程序
當沒有指定命令時,HelloWorld默認輸出一屏信息提示
Symfony Console組件給我們提供的應用程序有幾個開箱可用的選項的和命令,比如help,list和--version
解釋這個神奇的文件內容
OK,讓我們來看看我們的HelloWorld文件中的代碼。
- 我們引入
autoload.php以使用由composer提供的自動加載以及控制枱組件提供的各功能。
InputInterface和OutputInterface將使應用程序的輸入和輸出功能變得簡單,InputArgument和InputOption將幫助我們處理傳遞給我們HelloWorld應用程序的選項和參數。
require __DIR__.'/vendor/autoload.php';
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
-
symphony/console通過名稱實例化一個新的應用程序HelloWorld (v1.0.0),並註冊我們的greet命令。(new Application('Hello World', '1.0.0')) ->register('greet') -
我們添加一個可選的
name參數(addArgument()),並提供參數的簡短描述。然後,我們使用這個addOption()方法添加一個say選項。請注意,選項始終是可選的,但您可以指定要傳遞的值,也可以僅僅將其用作指boolean標識。->addArgument('name', InputArgument::OPTIONAL, 'Name of the person') ->addOption('say', null, InputOption::VALUE_REQUIRED, 'Custom greeting') -
setCode()方法中的代碼會包含我們應用程序的主邏輯,它會根據傳遞的參數和選項打印一個問候語到終端。我們監聽$input對象,使用getArgument()和getOption()輔助方法獲取傳遞給greet的選項和參數,然後,我們只需要檢查傳遞了哪些參數或者選項,並相應的(使用$output對象)向控制枱輸出打印問候語。這個writeln()方法可以根據標籤格式化文本,比如輸出不同顏色的info,error和warning。->setCode(function (InputInterface $input, OutputInterface $output) { $name = $input->getArgument('name'); $greeting = $input->getOption('say'); if (!empty($name) && !empty($greeting)) { return $output->writeln("<info>$greeting $name!</info>"); } else if (!empty($name)) { return $output->writeln("<info>Hello $name!</info>"); } else if (!empty($greeting)) { return $output->writeln("<info>$greeting World!</info>"); } else { return $output->writeln("<info>Hello World!</info>"); } }) -
最後我們引導應用程序
並調用他的方法,以便他做好隨時接收和處理greet命令。->getApplication() ->run();
現在讓我們在實例中看看我們HelloWorld程序
greet不傳遞任何參數和選項
greet有一個可選的name參數
greet使用say選項自定義問候語
- 最後,
greet自定義問候語和問候人
關於作者
程序開發人員,不拘泥於語言與技術,目前主要從事PHP和前端開發,使用Laravel和VueJs。合適和夠用是永不停息的追求。個人網站:https://www.linganmin.cn
譯者注:本文中的部分鏈接和圖片地址已更換為國內地址,如有翻譯錯誤請多指正。
Happy Coding!