ligne de commande
Le framework Symfony utilise des scripts bin/console
bin/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()
(comme le bien connu bin/console cache : clear code>
Composant Console
🎜🎜. Vous pouvez également l'utiliser pour créer vos propres commandes. 🎜🎜🎜🎜🎜Créez une commande 🎜🎜🎜🎜¶🎜🎜
🎜🎜🎜Nom 🎜🎜 défini par classes, qui doivent être stockées dans votre bundle (comme 🎜🎜AppBundleCommand
🎜🎜) dans l'espace de noms 🎜🎜Command
🎜🎜. Le nom de la classe doit être suffixé 🎜🎜Command
🎜🎜. 🎜🎜🎜🎜🎜🎜Par exemple, une commande nommée 🎜🎜CreateUser
🎜🎜 doit suivre cette structure : 🎜🎜🎜// ...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.');}🎜🎜🎜Commande de configuration 🎜🎜🎜🎜¶🎜🎜
🎜🎜🎜🎜Tout d'abord, vous devez configurer() Le nom de la commande de configuration dans le 🎜🎜 méthode. Ensuite, définissez éventuellement un message d'aide (message d'aide) et 🎜🎜🎜🎜options et paramètres d'entrée🎜🎜< /a >🎜🎜 (Options et paramètres de saisie) : 🎜🎜🎜
$ php bin/console app:create-user User Creator============ Whoa!You are about to create a user.🎜🎜🎜Exécuter la commande 🎜🎜🎜🎜¶🎜🎜< br/>🎜🎜🎜🎜Après avoir configuré la commande, vous pourrez l'exécuter dans le 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'));🎜🎜🎜 Vous pouvez déjà vous attendre à ce que cette commande ne fasse rien car vous n'avez pas écrit Enter toute logique. Ajoutez votre propre logique dans la méthode 🎜🎜
execute()
🎜🎜, qui a accès au flux d'entrée (par exemple, options et paramètres) et au flux de sortie pour écrire des informations sur la ligne de commande : 🎜 🎜 🎜$ php bin/console app:create-user Wouter User Creator============ Username: Wouter🎜🎜🎜Maintenant, essayez d'exécuter cette commande : 🎜🎜🎜
// ...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!'); }}
Entrée dans la console ¶
Utilisez des options ou des paramètres de saisie pour transmettre des informations à la commande :
// 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); // ... }}
Maintenant, vous pouvez transmettre un nom d'utilisateur à la commande :
// ...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); // ... }}
Référez-vous à Sortie de la console (Arguments et options) pour en savoir plus sur les options et les arguments de la ligne de commande.
Obtenir des services à partir de conteneurs de services ¶
Pour créer réellement un utilisateur, la commande doit accéder à certains services (services). Ceci peut être réalisé en faisant en sorte que la commande hérite de ContainerAwareCommand
ContainerAwareCommand
来实现:
现在,一旦你创建了所需的服务及其逻辑,命令将执行app.user_manager
服务的create()
方法,然后用户会被创建的命令生命周期
命令有三个生命周期方法可以在运行命令时使用:
initialize()
(可选)- 这个方法在
interact()
和execute()
方法之前执行。它的主要作用是初始化那些用在命令其余方法中的变量。 interact()
(可选)- 此方法在
initialize()
之后、execute()
之前执行。它的作用是检查是否错失了某些选项/参数,然后以互动方式向用户请求这些值。这是你可以问询错失的选项/参数的最后一个地方。此后,丢失的选项/参数将导致一个错误。 execute()
(必须)- 此方法在
interact()
andinitialize()
之后执行。它包含你希望命令去执行的逻辑。
测试命令 ¶
Symfony提供了几个工具来帮你测试命令。最有用的一个是 CommandTester
类。它使用特殊的input和output类,令“不在真正控制台中”的测试变得容易:
使用 ApplicationTester
你也可以测试整个控制台程序。
当Console组件被单独使用时,使用 SymfonyComponentConsoleApplication
和常规的 PHPUnit_Framework_TestCase
app.user_manager
🎜🎜 du service 🎜🎜create()
🎜🎜, puis l'utilisateur sera créé 🎜🎜 Cycle de vie de la commande 🎜🎜🎜🎜La commande dispose de trois méthodes de cycle de vie qui peuvent être utilisées lors de l'exécution de la commande : 🎜🎜🎜initialize() code> 🎜 🎜🎜 (facultatif) 🎜🎜🎜
- 🎜🎜Cette méthode est utilisée dans 🎜🎜
interact()
🎜🎜 et 🎜🎜execute()
est exécuté avant la méthode 🎜🎜. Son objectif principal est d'initialiser les variables utilisées dans le reste des méthodes de la commande. 🎜🎜 interact()
🎜🎜🎜(facultatif)🎜🎜🎜- Cette méthode est dans
initialize()
et avantexecute()
. Ce qu'il fait, c'est vérifier si certaines options/paramètres sont manquants, puis demander ces valeurs de manière interactive à l'utilisateur. C'est le dernier endroit où vous pouvez poser des questions sur les options/paramètres manquants. Par la suite, les options/arguments manquants entraîneront une erreur. execute()
🎜(obligatoire)🎜- Cette méthode est dans
interact()< /code> et
initialize()
sont exécutés ensuite. Il contient la logique que vous souhaitez que la commande exécute.
CommandTester
. Il utilise des classes d'entrée et de sortie spéciales pour faciliter les tests "pas dans une vraie console" : 🎜rrreee🎜🎜
Utilisez ApplicationTester
Vous pouvez également tester l'intégralité de l'application console. 🎜🎜🎜
🎜
Lorsque le composant Console est utilisé seul, utilisez SymfonyComponentConsoleApplication
et PHPUnit_Framework_TestCase
régulier. 🎜🎜🎜
Pour utiliser la configuration de conteneur de services la plus complète dans vos tests de console, vous pouvez hériter de vos tests de KernelTestCase
:
Console Helpers
Le composant Console comprend également un ensemble d'"assistants" - différents widgets peuvent vous aider à effectuer différentes tâches :
- Question Helper : demander des informations de manière interactive à l'utilisateur
- Formatter Helper : personnaliser la colorisation de sortie
- Progress Bar ( Progress bar) : affiche une barre de progression
- Table (table) : affiche données tabulaires sous forme de tableau