若是你是一名Web
開發工程師,那麼你必定使用PHP
開發過不少Web
應用程序。可是你知道如何使用PHP
快速構建一個命令行應用程序(工具)嗎?下面我將向您展現如何使用PHP
和一個著名的的Composer
擴展包--Symphony/Console構建一個命令行應用。前端
Symphony/Console是一個使用Composer
管理的PHP
擴展包,它簡化了建立一個漂亮的、可測試的PHP
命令行應用的過程,它提供了開箱即用的諸如(可選/必選的)參數規範和選項規範(使用-
符號)等功能。那麼,咱們來一塊兒開始構建咱們的應用。bash
按照慣例,咱們將構建一個「Hello World」的控制檯應用程序,可是要稍微修改一下它,讓它支持自定義問候語(代替Hello),而且能夠隨意的去問候一我的(代替world)。app
greet
(問候)命令,咱們將使用它來與應用程序交互。greet
能夠接受一個可選的參數(name
)來打印出一個被問候的人(默認是World)。greet
能夠接受一個選項(--say
)來更改問候語(默認是Hello)。Hello World
消息。爲咱們的項目建立新的目錄並cd
進入它:composer
mkdir hello-world-app && cd hello-world-app
複製代碼
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
控制檯程序 ui
Symfony Console
組件給咱們提供的應用程序有幾個開箱可用的選項的和命令,好比help
,list
和--version
spa
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();
複製代碼
greet
不傳遞任何參數和選項
greet
有一個可選的name
參數
greet
使用say
選項自定義問候語
最後,greet
自定義問候語和問候人
程序開發人員,不拘泥於語言與技術,目前主要從事PHP和前端開發,使用Laravel和VueJs。合適和夠用是永不停息的追求。
我的網站:https://www.linganmin.cn
譯者注:本文中的部分連接和圖片地址已更換爲國內地址,若有翻譯錯誤請多指正。 Happy Coding!