-
-
Notifications
You must be signed in to change notification settings - Fork 5.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Updated single command How to #6876
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,68 +6,51 @@ Building a single Command Application | |
|
||
When building a command line tool, you may not need to provide several commands. | ||
In such case, having to pass the command name each time is tedious. Fortunately, | ||
it is possible to remove this need by extending the application:: | ||
|
||
namespace Acme\Tool; | ||
|
||
use Symfony\Component\Console\Application; | ||
use Symfony\Component\Console\Input\InputInterface; | ||
|
||
class MyApplication extends Application | ||
{ | ||
/** | ||
* Gets the name of the command based on input. | ||
* | ||
* @param InputInterface $input The input interface | ||
* | ||
* @return string The command name | ||
*/ | ||
protected function getCommandName(InputInterface $input) | ||
{ | ||
// This should return the name of your command. | ||
return 'my_command'; | ||
} | ||
|
||
/** | ||
* Gets the default commands that should always be available. | ||
* | ||
* @return array An array of default Command instances | ||
*/ | ||
protected function getDefaultCommands() | ||
{ | ||
// Keep the core default commands to have the HelpCommand | ||
// which is used when using the --help option | ||
$defaultCommands = parent::getDefaultCommands(); | ||
|
||
$defaultCommands[] = new MyCommand(); | ||
|
||
return $defaultCommands; | ||
} | ||
|
||
/** | ||
* Overridden so that the application doesn't expect the command | ||
* name to be the first argument. | ||
*/ | ||
public function getDefinition() | ||
{ | ||
$inputDefinition = parent::getDefinition(); | ||
// clear out the normal first argument, which is the command name | ||
$inputDefinition->setArguments(); | ||
|
||
return $inputDefinition; | ||
} | ||
} | ||
|
||
When calling your console script, the command ``MyCommand`` will then always | ||
be used, without having to pass its name. | ||
|
||
You can also simplify how you execute the application:: | ||
|
||
#!/usr/bin/env php | ||
<?php | ||
// command.php | ||
|
||
use Acme\Tool\MyApplication; | ||
|
||
$application = new MyApplication(); | ||
$application->run(); | ||
it is possible to remove this need by declaring a single command application:: | ||
|
||
#!/usr/bin/env php | ||
<?php | ||
require __DIR__.'/vendor/autoload.php'; | ||
|
||
use Symfony\Component\Console\Application; | ||
use Symfony\Component\Console\Input\InputArgument; | ||
use Symfony\Component\Console\Input\InputInterface; | ||
use Symfony\Component\Console\Input\InputOption; | ||
use Symfony\Component\Console\Output\OutputInterface; | ||
|
||
(new Application('echo', '1.0.0')) | ||
->register('echo') | ||
->addArgument('foo', InputArgument::OPTIONAL, 'The directory') | ||
->addOption('bar', null, InputOption::VALUE_REQUIRED) | ||
->setCode(function(InputInterface $input, OutputInterface $output) { | ||
// output arguments and options | ||
}) | ||
->getApplication() | ||
->setDefaultCommand('echo', true) // Single command application | ||
->run(); | ||
|
||
The method :method:`Symfony\\Component\\Console\\Application::setDefaultCommand` | ||
accepts a boolean as second parameter. If true, the command ``echo`` will then | ||
always be used, without having to pass its name. | ||
|
||
Of course, you can still register a command as usual:: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. typo: courses There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Are you sure? :) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. My bad :) |
||
|
||
#!/usr/bin/env php | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. we usually use four spaces to indent code blocks There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok, I will update it :) |
||
<?php | ||
require __DIR__.'/vendor/autoload.php'; | ||
|
||
use Symfony\Component\Console\Application; | ||
use Symfony\Component\Console\Input\InputArgument; | ||
use Symfony\Component\Console\Input\InputInterface; | ||
use Symfony\Component\Console\Input\InputOption; | ||
use Symfony\Component\Console\Output\OutputInterface; | ||
|
||
use Acme\Command\DefaultCommand; | ||
|
||
$application = new Application('echo', '1.0.0'); | ||
$command = new DefaultCommand(); | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you do want a blank line here, you need to add two spaces into (see http://pr-6876-6qmocelev2lwe.eu.platform.sh/components/console/changing_default_command.html for the current result) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also, how do you find the correct link for the generated documentation ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just below, on the PR checks section you can click on "details" of the platformsh check |
||
$application->add($command); | ||
|
||
$application->setDefaultCommand($command->getName(), true); | ||
$application->run(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we elaborate a bit on this second argument? I guess that it may sound strange that you have to pass this option at all (one might expect from the name of the
setDefaultCommand()
method that this always is the case anyway).There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍 for explaining what is different when passing it
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure what you expect as an explanation, explain more is something like explain the code produced. This sounds like PHPDoc for getters/setters.
To me, in this example, the only thing to know is that passing a second parameter to
setDefaultCommand
transform your application into a single command application.If someone really want to know how we do it, I'm pretty sure he/she review the code produced (as I did ^^) ... what do you think @lyrixx ? What is really relevant to understand in your contribution ?