核心要點
這篇文章於2017年5月24日更新,提供了對這個重要現代工具的更全面的介紹。
"控制台組件簡化了創建美觀且可測試的命令行界面的過程。"
這是我們訪問Symfony Console組件工具頁面時看到的歡迎語。
作為軟件開發人員,我們經常需要使用命令行工具。當我們需要執行某種重複性任務(如遷移數據、執行導入或創建cron作業)時,這些工具非常有用。
Symfony Console組件工具為我們提供了一個簡單的框架來創建我們自己的命令行工具。
與Symfony中的許多組件不同,這是一個獨立的包,被Laravel的Artisan以及許多其他著名的PHP包使用。
要了解Symfony Console的替代方案,請參閱我們的比較文章:PHP控制台之戰!
安裝
composer require symfony/console
此處包含Composer的重要信息。
創建新命令
要創建新命令,我們需要確保我們的文件可執行。為此,讓我們在項目根目錄中創建一個控制台文件。此文件將作為我們的命令管理器。
touch console
現在,讓我們確保該文件可執行。
chmod 755 console
然後,讓我們確保我們的文件開頭有shebang。 shebang是一個字符序列(井號後跟感嘆號),出現在腳本的開頭。當存在shebang時,exec()將改為運行shebang後指定的可執行文件。在我們的例子中,它將作為PHP腳本運行。
之後,讓我們定義我們的控制台應用程序。我們的命令管理器的第一個迭代將如下所示:
#!/usr/bin/env php <?php require_once __DIR__ . '/vendor/autoload.php'; use Symfony\Component\Console\Application; $app = new Application(); $app->run();
讓我們仔細看看。首先,我們自動加載所有依賴項,然後從Console組件導入Application包。之後,我們創建一個Application的新實例並運行它。
如果我們使用./console
執行腳本,我們應該得到以下幫助消息:
這是因為我們還沒有註冊任何命令,我們只是構建了它們的的基本框架。
讓我們創建我們的腳本並在我們新創建的命令管理器中註冊它。
對於這個具體的例子,我們將實現兩個簡單的命令:一個用於哈希字符串,另一個用於確認哈希屬於給定的字符串。
我們將在其中放置我們的Hash.php類的/src
文件夾中,內容如下:
composer require symfony/console
現在是創建我們的命令的時候了。讓我們創建一個名為HashCommand.php的新PHP文件。
這個類將擴展Symfony的Command類並實現configure和execute方法。這些方法對於我們的命令至關重要,因為它們告訴命令如何外觀和行為。
完成的命令如下所示:
touch console
在configure部分,setName方法是我們調用命令的方式,setDescription是命令的描述,addArgument是我們聲明命令將接受一個名為Password的參數,並且它是必需的。
在execute部分,我們通過getArgument函數訪問參數,然後使用我們的Hash類對其進行哈希處理。最後,我們使用OutputInterface的writeln方法將結果打印到屏幕上。
如果我們像這樣運行我們的命令,我們將看到什麼也沒有發生。這是因為我們仍然缺少一個非常重要的步驟。我們仍然需要在控制台中註冊我們的命令。
chmod 755 console
在控制台中註冊了命令後,讓我們運行它。
如果我們再次運行./console
命令,我們可以看到我們現在註冊了一個新命令。
讓我們運行它:
#!/usr/bin/env php <?php require_once __DIR__ . '/vendor/autoload.php'; use Symfony\Component\Console\Application; $app = new Application(); $app->run();
我們看到最終結果:
哈希值是將PHP hash()方法應用於Sitepoint字符串的結果。
對於哈希確認功能,我們將使用相同的方法,但我們將有兩個參數,而不是一個。一個將是需要確認的字符串,另一個是我們想要驗證的哈希值。
我們將創建一個新的命令文件,就在HashCommand文件的旁邊。讓我們稱之為ConfirmCommand。
<?php namespace Hash; class Hash { /** * 接收一个字符串密码并对其进行哈希处理。 * * @param string $password * @return string $hash */ public static function hash($password) { return password_hash($password, PASSWORD_DEFAULT); } /** * 验证哈希是否与给定的密码相对应 * * @param string $password * @param string $hash * @return boolean 如果哈希是从密码生成的 */ public static function checkHash($string, $hash) { if (password_verify($string, $hash)) { return true; } return false; } }
然後,在控制台中註冊該命令。
<?php namespace Hash; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Formatter\OutputFormatterStyle; use Hash\Hash; class HashCommand extends Command { protected function configure() { $this->setName("Hash:Hash") ->setDescription("使用Bcrypt对给定字符串进行哈希处理。") ->addArgument('Password', InputArgument::REQUIRED, '你想要哈希什么?'); } protected function execute(InputInterface $input, OutputInterface $output) { $hash = new Hash(); $input = $input->getArgument('Password'); $result = $hash->hash($input); $output->writeln('你的密码哈希值:' . $result); } }
測試
在測試方面,Symfony為我們提供了一些方便的工具。其中最有用的是CommandTester類,因為它提供特殊的輸入和輸出類來測試我們的命令,而無需命令行。
讓我們使用CommandTester類為我們的Hash:Hash命令實現一個測試。
首先,讓我們在與我們的/src
文件夾相同的級別創建一個/tests
文件夾。
然後,讓我們在其中創建我們的測試類,並將其命名為HashCommandTest.php:
composer require symfony/console
我們首先使用Application類加載我們的命令。然後,我們實例化一個新的CommandTester。使用CommandTester,我們可以配置我們想要如何調用我們的命令。最後一步只是使用getDisplay()方法將執行結果與我們期望的結果進行比較。
getDisplay()方法保存我們命令執行的結果,就像我們在命令行中看到的那樣。
結論
我們剛剛使用Symfony Console組件創建了兩個不同的命令。我們還看到了測試這些命令的好方法。我建議您查看組件的各種選項和功能,並在下面的評論部分給我們一些關於您實驗的反饋。
您想在SitePoint上看到更多關於Symfony Console的高級教程嗎?請告訴我們!
我們在本文中編寫的全部代碼都可以在Github上找到。
Symfony Console是Symfony框架的一個組件,可以使用Composer(PHP中的依賴項管理工具)安裝。要安裝Symfony Console,您需要在終端中運行以下命令:composer require symfony/console
。此命令將下載並將Symfony Console組件安裝到您的項目中。
Symfony Console提供了一個簡單的API來創建命令行命令。這些命令可用於cron作業、遷移、導入或任何其他可以通過命令行運行的任務類型。它還支持輸出的彩色顯示、進度條、表格和其他交互式功能。
要創建新命令,您需要創建一個新類,該類擴展SymfonyComponentConsoleCommandCommand類。在此類中,您在configure方法中定義命令的名稱、描述、參數和選項。 execute方法包含命令的邏輯。
要運行命令,您需要使用bin/console
腳本,後跟命令的名稱。例如,如果您有一個名為app:my-command
的命令,您可以使用以下命令運行它:bin/console app:my-command
。
Symfony Console可以與Doctrine(Symfony中的數據庫抽象層)結合使用來管理數據庫遷移。您可以創建一個新命令,該命令執行必要的SQL查詢來遷移您的數據庫。
可以在命令類的configure方法中定義命令參數和選項。您可以使用getArgument和getOption方法在execute方法中檢索這些參數和選項的值。
Symfony Console提供了幾種顯示輸出的方法。您可以使用writeln方法顯示一行文本,使用write方法顯示文本(末尾沒有換行符),以及使用table方法顯示表格。
可以通過拋出異常來處理錯誤。 Symfony Console將捕獲這些異常並顯示錯誤消息。您還可以使用exit方法停止命令的執行並返回退出代碼。
Symfony Console提供了一個CommandTester類,可用於測試命令。您可以使用此類來使用特定參數和選項執行命令,並斷言輸出和退出代碼。
在Symfony項目中,您可以使用bin/console
腳本運行命令。您還可以通過在src/Command
目錄中創建一個擴展SymfonyComponentConsoleCommandCommand類的新類來創建您自己的命令。
以上是重新引入Symfony Console -CLI PHP,用於初學者!的詳細內容。更多資訊請關注PHP中文網其他相關文章!