コマンドライン


#Symfony フレームワークは、bin/console スクリプト (よく知られた ## など) を使用します。 #bin/console Cache:clearcommand) には、多数のコマンドが用意されています。これらのコマンドは、#コンソール コンポーネント を通じて作成されます。これを使用して独自のコマンドを作成することもできます。

コマンドの作成

# #Naming

クラスによって定義されているこれらのクラスはバンドル (AppBundle\Command など) コマンド 名前空間。クラス名には Command という接尾辞を付ける必要があります。

たとえば、

CreateUser という名前のコマンドは、次の構造に従う必要があります。

// src/AppBundle/Command/CreateUserCommand.phpnamespace AppBundle\Command; use Symfony\Component\Console\Command\Command;use Symfony\Component\Console\Input\InputInterface;use Symfony\Component\Console\Output\OutputInterface; class CreateUserCommand extends Command{
    protected function configure()
    {
        // ...
    }     protected function execute(InputInterface $input, OutputInterface $output)
    {
        // ...
    }}

設定コマンド

##¶ #まず、

configure() メソッドでコマンドの名前を設定する必要があります。次に、オプションでヘルプ メッセージ (ヘルプ メッセージ) と #入力オプションと入力パラメータ ## を定義します。 ## (オプションとパラメータの入力):

// ...protected function configure(){
    $this
        // the name of the command (the part after "bin/console")
        // 命令的名字("bin/console" 后面的部分)
        ->setName('app:create-users')         // the short description shown while running "php bin/console list"
        // 运行 "php bin/console list" 时的简短描述
        ->setDescription('Creates new users.')         // the full command description shown when running the command with
        // the "--help" option
        // 运行命令时使用 "--help" 选项时的完整命令描述
        ->setHelp("This command allows you to create users...")
    ;}
コマンドの実行

#コマンドを設定した後、ターミナル (ターミナル) で実行できます:

$  php bin/console app:create-users

まだロジックを記述していないため、このコマンドは何も実行しないことがすでに予想できます。

execute()

メソッドに独自のロジックを追加します。このメソッドは、入力ストリーム (オプションやパラメーターなど) と書き込む出力ストリームにアクセスできます。コマンド ラインへ):

// ...protected function execute(InputInterface $input, OutputInterface $output){
    // outputs multiple lines to the console (adding "\n" at the end of each line)
    // 输出多行到控制台(在每一行的末尾添加 "\n")
    $output->writeln([
        'User Creator',
        '============',
        '',
    ]);     // outputs a message followed by a "\n"
    $output->writeln('Whoa!');     // outputs a message without adding a "\n" at the end of the line
    $output->write('You are about to ');
    $output->write('create a user.');}
次に、次のコマンドを実行してみます:
$  php bin/console app:create-user
User Creator============ 
Whoa!You are about to create a user.

コンソール入力

# 入力を使用コマンドに情報を渡すためのオプションまたはパラメータ:

use Symfony\Component\Console\Input\InputArgument; // ...protected function configure(){
    $this
        // configure an argument / 配置一个参数
        ->addArgument('username', InputArgument::REQUIRED, 'The username of the user.')
        // ...
    ;} // ...public function execute(InputInterface $input, OutputInterface $output){
    $output->writeln([
        'User Creator',
        '============',
        '',
    ]);     // retrieve the argument value using getArgument()
    // 使用 getArgument() 取出参数值
    $output->writeln('Username: '.$input->getArgument('username'));

これで、ユーザー名をコマンドに渡すことができます:

$  php bin/console app:create-user Wouter
User Creator============ 
Username: Wouter

##参考##コンソール出力 (パラメータとオプション) #コマンドラインのオプションとパラメータの詳細については、こちらをご覧ください。

サービス コンテナからサービスを取得する

実際にuser の場合、コマンドは特定の services (サービス) にアクセスする必要があります。これは、コマンドを ContainerAwareCommand:

// ...use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; class CreateUserCommand extends ContainerAwareCommand{
    // ...     protected function execute(InputInterface $input, OutputInterface $output)
    {
        // ...         // access the container using getContainer()
        // 使用 getContainer() 访问服务容器
        $userManager = $this->getContainer()->get('app.user_manager');
        $userManager->create($input->getArgument('username'));         $output->writeln('User successfully generated!');
    }}

Now から継承させることで実現できます。必要なサービスとそのロジックを作成すると、コマンドは app.user_managercreate()# of を実行します。サービス ## メソッド、その後ユーザーが作成されます コマンド ライフ サイクル

コマンドには、次の 3 つのライフ サイクル メソッドがあります。コマンドの実行時に使用されます:

    #initialize()
  • (オプション)
  • このメソッドは、interact() および execute で使用されます。 ()メソッドの前に実行します。その主な目的は、コマンドの残りのメソッドで使用される変数を初期化することです。
  • interact()
  • (オプション)これメソッドは、
  • initialize()
  • の後、execute() の前に実行されます。これは、いくつかのオプション/パラメータが欠落しているかどうかを確認し、それらの値をユーザーに対話的に要求します。これは、欠落しているオプション/パラメータについて質問できる最後の場所です。それ以降は、オプション/引数が不足しているとエラーが発生します。
  • execute()
  • (必須)このメソッドは、
  • interact()
  • initialize( ) 後で実行されます。これには、コマンドで実行するロジックが含まれています。
  • コマンドのテスト ¶

Symfony は、コマンドのテストに役立ついくつかのツールを提供します。最も便利なクラスは

CommandTester

クラスです。特別な入出力クラスを使用して、「実際のコンソールではない」テストを簡単にします。

// tests/AppBundle/Command/CreateUserCommandTest.phpnamespace Tests\AppBundle\Command; use AppBundle\Command\CreateUserCommand;use Symfony\Bundle\FrameworkBundle\Console\Application;use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;use Symfony\Component\Console\Tester\CommandTester; class CreateUserCommandTest extends KernelTestCase{
    public function testExecute()
    {
        self::bootKernel();
        $application = new Application(self::$kernel);         $application->add(new CreateUserCommand());         $command = $application->find('app:create-user');
        $commandTester = new CommandTester($command);
        $commandTester->execute(array(
            'command'  => $command->getName(),             // pass arguments to the helper / 传入参数给helper
            'username' => 'Wouter',             // prefix the key with a double slash when passing options,
            // e.g: '--some-option' => 'option_value',
            // 需要选项时,对key加“双中杠”的前缀,如'--some-option' => 'option_value'
        ));         // the output of the command in the console
        // 控制台中的命令输出
        $output = $commandTester->getDisplay();
        $this->assertContains('Username: Wouter', $output);         // ...
    }}


Use
ApplicationTester

です。コンソールプログラム全体をテストすることが可能です。


Console コンポーネントを単独で使用する場合は、
Symfony\Component\Console\Application

と通常の # を使用します。 ##\PHPUnit_Framework_TestCase

コンソール テストで最も完全なサービス コンテナーのセットアップを使用するには、KernelTestCase:

// ...use Symfony\Component\Console\Tester\CommandTester;use Symfony\Bundle\FrameworkBundle\Console\Application;use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; class CreateUserCommandTest extends KernelTestCase{
    public function testExecute()
    {
        $kernel = $this->createKernel();
        $kernel->boot();         $application = new Application($kernel);
        $application->add(new CreateUserCommand());         $command = $application->find('app:create-user');
        $commandTester = new CommandTester($command);
        $commandTester->execute(array(
            'command'  => $command->getName(),
            'username' => 'Wouter',
        ));         $output = $commandTester->getDisplay();
        $this->assertContains('Username: Wouter', $output);         // ...
    }}

Console Assistant

からテストを継承できます。コンソール コンポーネントには以下も含まれます一連の「ヘルパー」 - さまざまなタスクの完了を支援するさまざまなガジェット:

  • 質問ヘルパー: ユーザーに対話的に情報を尋ねる
  • フォーマッターHelper: 出力の色付けをカスタマイズします。
  • Progress Bar: 進行状況バーを表示します。
  • Table: 表形式のデータを表として表示します## #################