baris arahan


Rangka kerja Symfony melalui bin/konsolbin/console脚本(如,广为人知的bin/console cache:clear命令)提供了大量命令。这些命令是通过控制台组件被创建的。你也可以使用它创建自己的命令。

创建一个命令 

命名通过类来定义,这些类必须存放在你的束(如AppBundleCommand)的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()#🎜🎜 Skrip (seperti arahan bin/console cache:clear yang terkenal) menyediakan sejumlah besar arahan . Arahan ini dicipta melalui

komponen konsol

#🎜🎜#. Anda juga boleh menggunakannya untuk membuat arahan anda sendiri. #🎜🎜##🎜🎜##🎜🎜#

#🎜🎜##🎜🎜#Create a command #

code class="notranslate">AppBundleCommand#🎜🎜##🎜🎜 #) daripada #🎜🎜##🎜🎜#Arahan#🎜🎜##🎜🎜 #Di bawah ruang nama. Nama kelas mestilah #🎜🎜##🎜🎜#Arahan#🎜🎜##🎜🎜# diakhiri. #🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#Sebagai contoh, pengguna bernama #🎜🎜##🎜🎜#CreateUser Arahan untuk #🎜🎜##🎜🎜# mesti mengikut struktur ini: #🎜🎜##🎜🎜##🎜🎜#
// ...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.');}
#🎜🎜##🎜🎜##🎜🎜#Arahan Konfigurasi #🎜🎜 🎜# #🎜🎜##🎜🎜#¶#🎜🎜##🎜🎜#
#🎜🎜# #🎜 🎜##🎜🎜##🎜🎜#Pertama, anda mesti mengkonfigurasi arahan dalam #🎜🎜##🎜🎜#configure()#🎜🎜##🎜 🎜# nama kaedah. Kemudian secara pilihan tentukan mesej bantuan (mesej bantuan) dan #🎜🎜##🎜🎜##🎜🎜##🎜🎜# Pilihan input dan parameter input #🎜🎜##🎜🎜##🎜🎜##🎜🎜# (Pilihan input dan parameter): #🎜🎜##🎜🎜##🎜🎜#
$  php bin/console app:create-user
User Creator============ 
Whoa!You are about to create a user.
# 🎜🎜 ##🎜🎜##🎜🎜#Laksanakan arahan #🎜🎜##🎜🎜##🎜🎜##🎜🎜#¶# 🎜🎜 ##🎜🎜#
#🎜🎜##🎜🎜##🎜🎜##🎜🎜#Selepas mengkonfigurasi arahan, anda boleh melaksanakannya di terminal (terminal): #🎜🎜 ## 🎜🎜##🎜🎜#
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'));
#🎜🎜##🎜🎜##🎜🎜# Anda sudah boleh menjangkakan bahawa arahan ini tidak akan melakukan apa-apa kerana anda belum menulis sebarang logik lagi. Tambahkan logik anda sendiri dalam kaedah #🎜🎜##🎜🎜#execute()#🎜🎜##🎜🎜#, yang mempunyai akses kepada aliran input (cth., pilihan dan parameter) dan Output strim menulis maklumat ke baris arahan): #🎜🎜##🎜🎜##🎜🎜#
$  php bin/console app:create-user Wouter
User Creator============ 
Username: Wouter
#🎜🎜##🎜🎜##🎜🎜#Sekarang, cuba laksanakan arahan ini: #🎜🎜##🎜 #🎜 🎜🎜#
// ...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!');
    }}

Input konsol #🎜🎜 🎜#

Gunakan pilihan input atau parameter untuk menghantar maklumat kepada arahan:

// 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);         // ...
    }}
#🎜🎜🎜🎜🎜🎜 #Sekarang, anda boleh menghantar nama pengguna ke dalam arahan:

// ...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);         // ...
    }}

#🎜🎜🎜

Output konsol (parameter dan pilihan) untuk mengetahui lebih lanjut tentang pilihan baris arahan dan maklumat parameter. Dapatkan perkhidmatan daripada bekas perkhidmatan Ini boleh dicapai dengan mewarisi perintah daripada

ContainerAwareCommand: rrreee

Sekarang setelah anda mencipta perkhidmatan yang diperlukan dan logiknya, arahan itu akan laksanakan

app.user_manager kaedah create(), kemudian pengguna akan dibuat Kitaran hayat perintah Arahan mempunyai tiga kaedah kitaran hayat yang boleh digunakan semasa menjalankan arahan: ContainerAwareCommand来实现:

rrreee

现在,一旦你创建了所需的服务及其逻辑,命令将执行app.user_manager服务的create()方法,然后用户会被创建的命令生命周期  

命令有三个生命周期方法可以在运行命令时使用:

  • initialize() (可选)
  • 这个方法在interact()execute()方法之前执行。它的主要作用是初始化那些用在命令其余方法中的变量。
  • interact() (可选)
  • 此方法在 initialize() 之后、 execute() 之前执行。它的作用是检查是否错失了某些选项/参数,然后以互动方式向用户请求这些值。这是你可以问询错失的选项/参数的最后一个地方。此后,丢失的选项/参数将导致一个错误。
  • execute() (必须)
  • 此方法在 interact() and initialize() 之后执行。它包含你希望命令去执行的逻辑。

测试命令 ¶

Symfony提供了几个工具来帮你测试命令。最有用的一个是 CommandTester 类。它使用特殊的input和output类,令“不在真正控制台中”的测试变得容易:

rrreee


使用 ApplicationTester 你也可以测试整个控制台程序。


当Console组件被单独使用时,使用 SymfonyComponentConsoleApplication 和常规的 PHPUnit_Framework_TestCase

  • initialize()
🎜 (pilihan) 🎜🎜🎜
  • 🎜🎜Kaedah ini digunakan dalam 🎜🎜interact()🎜🎜 dan 🎜🎜execute() dilaksanakan sebelum kaedah 🎜🎜. Tujuan utamanya adalah untuk memulakan pembolehubah yang digunakan dalam kaedah arahan yang lain. 🎜🎜
  • interact() 🎜🎜🎜(pilihan)🎜🎜🎜
  • Kaedah ini dalam inisialisasi() dan sebelum execute(). Apa yang dilakukannya ialah menyemak sama ada beberapa pilihan/parameter tiada dan kemudian meminta nilai tersebut secara interaktif daripada pengguna. Ini ialah tempat terakhir anda boleh bertanya tentang pilihan/parameter yang hilang. Selepas itu, pilihan/parameter yang hilang akan mengakibatkan ralat.
  • execute() 🎜(required)🎜
  • Kaedah ini dalam interact()< / code> dan initialize() dilaksanakan selepas itu. Ia mengandungi logik yang anda mahu perintah itu dilaksanakan.
  • 🎜Menguji arahan ¶🎜🎜Symfony menyediakan beberapa alatan untuk membantu anda menguji arahan. Yang paling berguna ialah kelas CommandTester. Ia menggunakan kelas input dan output khas untuk memudahkan ujian "bukan dalam konsol sebenar": 🎜rrreee🎜
    🎜

    Gunakan ApplicationTester Anda juga boleh menguji keseluruhan aplikasi konsol. 🎜🎜🎜
    🎜

    Apabila komponen Konsol digunakan secara bersendirian, gunakan SymfonyComponentConsoleApplication dan PHPUnit_Framework_TestCase biasa. 🎜🎜🎜

    Untuk menggunakan persediaan bekas perkhidmatan yang paling lengkap dalam ujian konsol anda, anda boleh mewarisi ujian anda daripada KernelTestCase:

    rrreee

    Console Helpers

    Komponen Console juga termasuk set "pembantu" - Widget berbeza boleh membantu anda menyelesaikan tugasan yang berbeza: . data jadual sebagai jadual