首頁 >後端開發 >php教程 >重新引入Symfony Console -CLI PHP,用於初學者!

重新引入Symfony Console -CLI PHP,用於初學者!

Christopher Nolan
Christopher Nolan原創
2025-02-10 14:06:15577瀏覽

Re-Introducing Symfony Console - CLI PHP for the Uninitiated!

核心要點

  • Symfony Console是一個獨立的包,提供了一個簡單的框架來創建命令行工具,這對於重複性任務(如數據遷移、導入或創建cron作業)非常有用。
  • 要創建新的命令,需要使文件可執行。這可以通過在項目根目錄中創建控制台文件、確保文件可執行以及定義控制台應用程序來完成。
  • 可以使用Symfony的CommandTester類測試命令,該類提供特殊的輸入和輸出類來測試命令,而無需命令行。
  • Symfony Console是使用Composer(PHP中的依賴項管理工具)安裝的。它提供了一個簡單的API來創建命令行命令,並支持輸出的彩色顯示、進度條、表格和其他交互式功能。

這篇文章於2017年5月24日更新,提供了對這個重要現代工具的更全面的介紹。


"控制台組件簡化了創建美觀且可測試的命令行界面的過程。"

這是我們訪問Symfony Console組件工具頁面時看到的歡迎語。

作為軟件開發人員,我們經常需要使用命令行工具。當我們需要執行某種重複性任務(如遷移數據、執行導入或創建cron作業)時,這些工具非常有用。

Re-Introducing Symfony Console - CLI PHP for the Uninitiated!

Symfony Console組件工具為我們提供了一個簡單的框架來創建我們自己的命令行工具。

與Symfony中的許多組件不同,這是一個獨立的包,被Laravel的Artisan以及許多其他著名的PHP包使用。

要了解Symfony Console的替代方案,請參閱我們的比較文章:PHP控制台之戰!

安裝

<code class="language-bash">composer require symfony/console</code>

此處包含Composer的重要信息。

創建新命令

要創建新命令,我們需要確保我們的文件可執行。為此,讓我們在項目根目錄中創建一個控制台文件。此文件將作為我們的命令管理器。

<code class="language-bash">touch console</code>

現在,讓我們確保該文件可執行。

<code class="language-bash">chmod 755 console</code>

然後,讓我們確保我們的文件開頭有shebang。 shebang是一個字符序列(井號後跟感嘆號),出現在腳本的開頭。當存在shebang時,exec()將改為運行shebang後指定的可執行文件。在我們的例子中,它將作為PHP腳本運行。

之後,讓我們定義我們的控制台應用程序。我們的命令管理器的第一個迭代將如下所示:

<code class="language-php">#!/usr/bin/env php

<?php require_once __DIR__ . '/vendor/autoload.php';

use Symfony\Component\Console\Application;

$app = new Application();
$app->run();</code>

讓我們仔細看看。首先,我們自動加載所有依賴項,然後從Console組件導入Application包。之後,我們創建一個Application的新實例並運行它。

如果我們使用./console執行腳本,我們應該得到以下幫助消息:

Re-Introducing Symfony Console - CLI PHP for the Uninitiated!

這是因為我們還沒有註冊任何命令,我們只是構建了它們的的基本框架。

讓我們創建我們的腳本並在我們新創建的命令管理器中註冊它。

對於這個具體的例子,我們將實現兩個簡單的命令:一個用於哈希字符串,另一個用於確認哈希屬於給定的字符串。

我們將在其中放置我們的Hash.php類的/src文件夾中,內容如下:

<code class="language-bash">composer require symfony/console</code>

現在是創建我們的命令的時候了。讓我們創建一個名為HashCommand.php的新PHP文件。

這個類將擴展Symfony的Command類並實現configure和execute方法。這些方法對於我們的命令至關重要,因為它們告訴命令如何外觀和行為。

完成的命令如下所示:

<code class="language-bash">touch console</code>

在configure部分,setName方法是我們調用命令的方式,setDescription是命令的描述,addArgument是我們聲明命令將接受一個名為Password的參數,並且它是必需的。

在execute部分,我們通過getArgument函數訪問參數,然後使用我們的Hash類對其進行哈希處理。最後,我們使用OutputInterface的writeln方法將結果打印到屏幕上。

如果我們像這樣運行我們的命令,我們將看到什麼也沒有發生。這是因為我們仍然缺少一個非常重要的步驟。我們仍然需要在控制台中註冊我們的命令。

<code class="language-bash">chmod 755 console</code>

在控制台中註冊了命令後,讓我們運行它。

如果我們再次運行./console命令,我們可以看到我們現在註冊了一個新命令。

Re-Introducing Symfony Console - CLI PHP for the Uninitiated!

讓我們運行它:

<code class="language-php">#!/usr/bin/env php

<?php require_once __DIR__ . '/vendor/autoload.php';

use Symfony\Component\Console\Application;

$app = new Application();
$app->run();</code>

我們看到最終結果:

Re-Introducing Symfony Console - CLI PHP for the Uninitiated!

哈希值是將PHP hash()方法應用於Sitepoint字符串的結果。

對於哈希確認功能,我們將使用相同的方法,但我們將有兩個參數,而不是一個。一個將是需要確認的字符串,另一個是我們想要驗證的哈希值。

我們將創建一個新的命令文件,就在HashCommand文件的旁邊。讓我們稱之為ConfirmCommand。

<code class="language-php"><?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;
    }

}</code>

然後,在控制台中註冊該命令。

<code class="language-php"><?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);

    }

}</code>

測試

在測試方面,Symfony為我們提供了一些方便的工具。其中最有用的是CommandTester類,因為它提供特殊的輸入和輸出類來測試我們的命令,而無需命令行。

讓我們使用CommandTester類為我們的Hash:Hash命令實現一個測試。

首先,讓我們在與我們的/src文件夾相同的級別創建一個/tests文件夾。

然後,讓我們在其中創建我們的測試類,並將其命名為HashCommandTest.php:

<code class="language-bash">composer require symfony/console</code>

我們首先使用Application類加載我們的命令。然後,我們實例化一個新的CommandTester。使用CommandTester,我們可以配置我們想要如何調用我們的命令。最後一步只是使用getDisplay()方法將執行結果與我們期望的結果進行比較。

getDisplay()方法保存我們命令執行的結果,就像我們在命令行中看到的那樣。

結論

我們剛剛使用Symfony Console組件創建了兩個不同的命令。我們還看到了測試這些命令的好方法。我建議您查看組件的各種選項和功能,並在下面的評論部分給我們一些關於您實驗的反饋。

您想在SitePoint上看到更多關於Symfony Console的高級教程嗎?請告訴我們!

我們在本文中編寫的全部代碼都可以在Github上找到。

Symfony Console常見問題解答

如何安裝Symfony Console?

Symfony Console是Symfony框架的一個組件,可以使用Composer(PHP中的依賴項管理工具)安裝。要安裝Symfony Console,您需要在終端中運行以下命令:composer require symfony/console。此命令將下載並將Symfony Console組件安裝到您的項目中。

Symfony Console的主要功能是什麼?

Symfony Console提供了一個簡單的API來創建命令行命令。這些命令可用於cron作業、遷移、導入或任何其他可以通過命令行運行的任務類型。它還支持輸出的彩色顯示、進度條、表格和其他交互式功能。

如何在Symfony Console中創建新命令?

要創建新命令,您需要創建一個新類,該類擴展SymfonyComponentConsoleCommandCommand類。在此類中,您在configure方法中定義命令的名稱、描述、參數和選項。 execute方法包含命令的邏輯。

如何運行Symfony Console中的命令?

要運行命令,您需要使用bin/console腳本,後跟命令的名稱。例如,如果您有一個名為app:my-command的命令,您可以使用以下命令運行它:bin/console app:my-command

如何將Symfony Console用於數據庫遷移?

Symfony Console可以與Doctrine(Symfony中的數據庫抽象層)結合使用來管理數據庫遷移。您可以創建一個新命令,該命令執行必要的SQL查詢來遷移您的數據庫。

如何在Symfony Console中處理命令參數和選項?

可以在命令類的configure方法中定義命令參數和選項。您可以使用getArgument和getOption方法在execute方法中檢索這些參數和選項的值。

如何在Symfony Console中顯示輸出?

Symfony Console提供了幾種顯示輸出的方法。您可以使用writeln方法顯示一行文本,使用write方法顯示文本(末尾沒有換行符),以及使用table方法顯示表格。

如何處理Symfony Console中的錯誤?

可以通過拋出異常來處理錯誤。 Symfony Console將捕獲這些異常並顯示錯誤消息。您還可以使用exit方法停止命令的執行並返回退出代碼。

如何測試Symfony Console中的命令?

Symfony Console提供了一個CommandTester類,可用於測試命令。您可以使用此類來使用特定參數和選項執行命令,並斷言輸出和退出代碼。

如何在Symfony項目中使用Symfony Console?

在Symfony項目中,您可以使用bin/console腳本運行命令。您還可以通過在src/Command目錄中創建一個擴展SymfonyComponentConsoleCommandCommand類的新類來創建您自己的命令。

以上是重新引入Symfony Console -CLI PHP,用於初學者!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn