Symfony 控制台命令
最后修改于 2020 年 7 月 5 日
Symfony 控制台命令教程展示了如何在 Symfony 中创建控制台命令。我们将为一个控制台应用程序创建几个命令。
Symfony
Symfony 是一套可重用的 PHP 组件,也是一个用于 Web 项目的 PHP 框架。Symfony 于 2005 年发布为自由软件。Symfony 的最初作者是 Fabien Potencier。Symfony 深受 Spring Framework 的启发。
Symfony 控制台组件
Symfony 控制台组件允许我们创建命令行命令。控制台命令可用于创建计划任务、导入、批处理作业或一些支持性任务。Symfony 控制台命令可以在 Symfony 控制台应用程序或 Web 应用程序中使用。在本教程中,我们将为控制台应用程序创建命令。
Symfony 控制台命令示例
在下面的示例中,我们使用 Symfony 控制台组件创建一个 Symfony 控制台应用程序。
$ mkdir commands $ cd commands
我们创建一个项目目录并进入其中。
$ composer require symfony/console
我们安装 console
包。
{ "name": "Symfony command application", "description": "This application demonstrates the usage of a Symfony command in a console application", "require": { "symfony/console": "^4.2" }, "autoload": { "psr-4": { "App\\": "src" } } }
我们更新 composer.json
文件。我们启用位于 src
目录下的 PHP 类的自动加载,命名空间为 App
。
$ composer dump-autoload -o
创建完文件后,我们需要调用 composer dump-autoload -o
命令,该命令会创建一个将类映射到 PHP 文件的文件。
在应用程序中,我们将有五个命令
- TimeCommand - 显示当前日期和时间
- MessageCommand - 显示用户输入的 mensajes
- ColorCommand - 以彩色显示 mensajes
- BooksCommand - 在表格中显示书籍列表
- AskNameCommand - 交互式询问用户姓名
命令在 src/Command
目录中创建。命令必须继承 Symfony\Component\Console\Command
并实现其 configure()
和 execute()
方法。
稍后,使用 add()
方法将命令添加到 Symfony\Component\Console\Application
中。
<?php namespace App\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class TimeCommand extends Command { protected function configure() { $this->setName('time') ->setDescription('Shows current date and time') ->setHelp('This command prints the current date and time'); } protected function execute(InputInterface $input, OutputInterface $output) { $now = date('c'); $message = sprintf("Current date and time: %s", $now); $output->writeln($message); } }
TimeCommand
显示当前的日期和时间。
protected function configure() { $this->setName('time') ->setDescription('Shows current date and time') ->setHelp('This command prints the current date and time'); }
在 configure()
方法中,我们使用 setName()
设置命令的名称。该名称将显示在可用命令列表中。我们还为命令添加了描述和帮助信息。
protected function execute(InputInterface $input, OutputInterface $output) { $now = date('c'); $message = sprintf("Current date and time: %s", $now); $output->writeln($message); }
InputInterface
用于获取用户输入,OutputInterface
用于显示输出。在我们的例子中,我们使用 date()
获取当前日期和时间,格式为标准的 ISO 格式,并使用 writeln()
将其输出到控制台。
<?php namespace App\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Input\InputArgument; class MessageCommand extends Command { protected function configure() { $this->setName('msg') ->setDescription('Prints a user provided message') ->setHelp('This command prints a message provided by the user') ->addArgument('msg', InputArgument::REQUIRED, 'Pass a message'); } protected function execute(InputInterface $input, OutputInterface $output) { $message = sprintf('The message is: %s', $input->getArgument('msg')); $output->writeln($message); } }
MessageCommand
打印从用户参数中获取的消息,并将其输出到控制台。
$this->setName('msg') ->setDescription('Prints a user provided message') ->setHelp('This command prints a message provided by the user') ->addArgument('msg', InputArgument::REQUIRED, 'Pass a message');
参数可以是必需的,也可以是可选的。InputArgument::REQUIRED
值使参数成为必需的。
$message = sprintf('The message is: %s', $input->getArgument('msg')); $output->writeln($message);
我们使用 getArgument()
从输入中检索参数,并使用 writeln()
将其写入控制台。
<?php namespace App\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Formatter\OutputFormatterStyle; class ColorCommand extends Command { protected function configure() { $this->setName('colc') ->setDescription('Shows output in color') ->setHelp('This command shows output in color'); } protected function execute(InputInterface $input, OutputInterface $output) { $output->writeln("<info>Today is a windy day</info>"); $outputStyle = new OutputFormatterStyle('red'); $output->getFormatter()->setStyle('redt', $outputStyle); $output->writeln('<redt>Tomorrow will be snowing</redt>'); } }
ColorCommand
以彩色显示文本。
$output->writeln("<info>Today is a windy day</info>");
在这种情况下,我们使用内置的 info
格式样式。
$outputStyle = new OutputFormatterStyle('red'); $output->getFormatter()->setStyle('redt', $outputStyle); $output->writeln('<redt>Tomorrow will be snowing</redt>');
我们也可以使用 OutputFormatterStyle
创建自定义输出样式。我们的 redt
以红色显示文本。
<?php namespace App\Command; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class BooksCommand extends Command { protected function configure() { $this->setName('books') ->setDescription('Shows books in a table') ->setHelp('This command demonstrates the usage of a table helper'); } protected function execute(InputInterface $input, OutputInterface $output) { $table = new Table($output); $table->setHeaderTitle('Books') ->setHeaders(['Title', 'ISBN', 'Author', 'Publisher']) ->setRows([ ['Java Language Features', '978-1-4842-3347-4', 'Kishori Sharan', 'Apress' ], ['Python Testing with pytest', '978-1-68-050-240-4', 'Brian Okken', 'The Pragmatic Programmers' ], ['Deep Learning with Python', '978-1-61729-443-3', 'Francois Chollet', 'Manning' ], ['Laravel up & Running', '978-1-491-93698-5', 'Matt Stauffer', 'O\'Reilly' ], ['Sams Teach Yourself TCP/IP', '978-0-672-33789-5', 'Joe Casad', 'SAMS' ] ]); $table->render(); } }
BooksCommand
使用表格助手以表格格式输出数据。
$table = new Table($output);
我们创建一个 Table
助手实例。
$table->setHeaderTitle('Books') ->setHeaders(['Title', 'ISBN', 'Author', 'Publisher']) ->setRows([ ['Java Language Features', '978-1-4842-3347-4', 'Kishori Sharan', 'Apress' ], ['Python Testing with pytest', '978-1-68-050-240-4', 'Brian Okken', 'The Pragmatic Programmers' ], ['Deep Learning with Python', '978-1-61729-443-3', 'Francois Chollet', 'Manning' ], ['Laravel up & Running', '978-1-491-93698-5', 'Matt Stauffer', 'O\'Reilly' ], ['Sams Teach Yourself TCP/IP', '978-0-672-33789-5', 'Joe Casad', 'SAMS' ] ]);
我们构建表格。表格的标题通过 setHeaderTitle()
指定。header
名称通过 setHeaders()
指定。最后,通过 setRows()
添加数据。
$table->render();
表格通过 render()
渲染。
<?php namespace App\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Question\Question; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class AskNameCommand extends Command { protected function configure() { $this->setName('ask') ->setDescription('Interactively asks name from the user') ->setHelp('This command asks a user name interactively and prints it'); } protected function execute(InputInterface $input, OutputInterface $output) { $helper = $this->getHelper('question'); $question = new Question("Enter your name: ", "guest"); $name = $helper->ask($input, $output, $question); $message = sprintf("Hello %s!", $name); $output->writeln($message); } }
AskNameCommand
使用问题助手向用户提问。
$helper = $this->getHelper('question');
通过 getHelper()
创建一个问题助手。
$question = new Question("Enter your name: ", "guest");
创建一个新的 Question
问题。第二个参数是默认值。
$name = $helper->ask($input, $output, $question);
使用 ask()
激活问题。用户输入存储在 $name
变量中。
$message = sprintf("Hello %s!", $name);
我们使用 sprintf()
根据用户输入构建一条消息。
$output->writeln($message);
最后,使用 writeln()
在终端显示消息。
使用 Symfony\Component\Console\Application
创建一个新的 Symfony 应用程序。
<?php require __DIR__ . '/vendor/autoload.php'; use App\Command\TimeCommand; use App\Command\BooksCommand; use App\Command\ColorCommand; use App\Command\AskNameCommand; use App\Command\MessageCommand; use Symfony\Component\Console\Application; $app = new Application(); $app->add(new MessageCommand()); $app->add(new TimeCommand()); $app->add(new AskNameCommand()); $app->add(new BooksCommand()); $app->add(new ColorCommand()); $app->run();
我们创建了一个包含五个命令的 Symfony 控制台应用程序。
$app = new Application();
创建了一个新的控制台应用程序。
$app->add(new MessageCommand()); $app->add(new TimeCommand()); $app->add(new AskNameCommand()); $app->add(new BooksCommand()); $app->add(new ColorCommand());
我们将命令添加到应用程序中。
$app->run();
使用 run()
启动应用程序。
$ php application.php list Console Tool ... Available commands: ask Interactively asks name from the user books Shows books in a table colc Shows output in color help Displays help for a command list Lists commands msg Prints a user provided message time Shows current date and time
我们可以获取我们命令的列表。
$ php application.php books +----------------------------+--------------- Books -----------------+---------------------------+ | Title | ISBN | Author | Publisher | +----------------------------+--------------------+------------------+---------------------------+ | Java Language Features | 978-1-4842-3347-4 | Kishori Sharan | Apress | | Python Testing with pytest | 978-1-68-050-240-4 | Brian Okken | The Pragmatic Programmers | | Deep Learning with Python | 978-1-61729-443-3 | Francois Chollet | Manning | | Laravel up & Running | 978-1-491-93698-5 | Matt Stauffer | O'Reilly | | Sams Teach Yourself TCP/IP | 978-0-672-33789-5 | Joe Casad | SAMS | +----------------------------+--------------------+------------------+---------------------------+
我们运行 books 命令。
$ php application.php time Current date and time: 2018-12-20T23:27:16+01:00
我们运行 time 命令。
在本教程中,我们在 Symfony 控制台应用程序中创建了五个控制台命令。
$ php application.php ask Enter your name: Peter Hello Peter!
我们运行 ask 命令。
在本教程中,我们在 Symfony 控制台应用程序中创建了五个控制台命令。
列出 所有 Symfony 教程。