feature #15972 [Console] Updated the styles of the server commands (javiereguiluz)
This PR was squashed before being merged into the 2.8 branch (closes #15972).
Discussion
----------
[Console] Updated the styles of the server commands
| Q | A
| ------------- | ---
| Bug fix? | no
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | -
| License | MIT
| Doc PR | -
This PR uses `comment()` which hasn't been merged yet. WIP PR at #15964
![server_comparison_1](https://cloud.githubusercontent.com/assets/73419/10139550/a5dc0d70-6603-11e5-8b4c-30cae7f52232.png)
![server_comparison_2](https://cloud.githubusercontent.com/assets/73419/10139552/a82932f6-6603-11e5-9bf5-7d0944a98327.png)
Commits
-------
4e2cc0f
[Console] Updated the styles of the server commands
This commit is contained in:
commit
d65f864970
@ -15,6 +15,7 @@ use Symfony\Component\Console\Input\InputArgument;
|
|||||||
use Symfony\Component\Console\Input\InputOption;
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||||
use Symfony\Component\Process\PhpExecutableFinder;
|
use Symfony\Component\Process\PhpExecutableFinder;
|
||||||
use Symfony\Component\Process\ProcessBuilder;
|
use Symfony\Component\Process\ProcessBuilder;
|
||||||
|
|
||||||
@ -84,6 +85,8 @@ EOF
|
|||||||
*/
|
*/
|
||||||
protected function execute(InputInterface $input, OutputInterface $output)
|
protected function execute(InputInterface $input, OutputInterface $output)
|
||||||
{
|
{
|
||||||
|
$stdout = $output;
|
||||||
|
$output = new SymfonyStyle($input, $output);
|
||||||
$documentRoot = $input->getOption('docroot');
|
$documentRoot = $input->getOption('docroot');
|
||||||
|
|
||||||
if (null === $documentRoot) {
|
if (null === $documentRoot) {
|
||||||
@ -91,7 +94,7 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!is_dir($documentRoot)) {
|
if (!is_dir($documentRoot)) {
|
||||||
$output->writeln(sprintf('<error>The given document root directory "%s" does not exist</error>', $documentRoot));
|
$output->error(sprintf('The given document root directory "%s" does not exist', $documentRoot));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -104,17 +107,17 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($this->isOtherServerProcessRunning($address)) {
|
if ($this->isOtherServerProcessRunning($address)) {
|
||||||
$output->writeln(sprintf('<error>A process is already listening on http://%s.</error>', $address));
|
$output->error(sprintf('A process is already listening on http://%s.', $address));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('prod' === $env) {
|
if ('prod' === $env) {
|
||||||
$output->writeln('<error>Running PHP built-in server in production environment is NOT recommended!</error>');
|
$output->error('Running PHP built-in server in production environment is NOT recommended!');
|
||||||
}
|
}
|
||||||
|
|
||||||
$output->writeln(sprintf("Server running on <info>http://%s</info>\n", $address));
|
$output->success(sprintf('Server running on http://%s', $address));
|
||||||
$output->writeln('Quit the server with CONTROL-C.');
|
$output->comment('Quit the server with CONTROL-C.');
|
||||||
|
|
||||||
if (null === $builder = $this->createPhpProcessBuilder($output, $address, $input->getOption('router'), $env)) {
|
if (null === $builder = $this->createPhpProcessBuilder($output, $address, $input->getOption('router'), $env)) {
|
||||||
return 1;
|
return 1;
|
||||||
@ -124,26 +127,28 @@ EOF
|
|||||||
$builder->setTimeout(null);
|
$builder->setTimeout(null);
|
||||||
$process = $builder->getProcess();
|
$process = $builder->getProcess();
|
||||||
|
|
||||||
if (OutputInterface::VERBOSITY_VERBOSE > $output->getVerbosity()) {
|
if (OutputInterface::VERBOSITY_VERBOSE > $stdout->getVerbosity()) {
|
||||||
$process->disableOutput();
|
$process->disableOutput();
|
||||||
}
|
}
|
||||||
|
|
||||||
$this
|
$this
|
||||||
->getHelper('process')
|
->getHelper('process')
|
||||||
->run($output, $process, null, null, OutputInterface::VERBOSITY_VERBOSE);
|
->run($stdout, $process, null, null, OutputInterface::VERBOSITY_VERBOSE);
|
||||||
|
|
||||||
if (!$process->isSuccessful()) {
|
if (!$process->isSuccessful()) {
|
||||||
$output->writeln('<error>Built-in server terminated unexpectedly</error>');
|
$errorMessages = array('Built-in server terminated unexpectedly.');
|
||||||
|
|
||||||
if ($process->isOutputDisabled()) {
|
if ($process->isOutputDisabled()) {
|
||||||
$output->writeln('<error>Run the command again with -v option for more details</error>');
|
$errorMessages[] = 'Run the command again with -v option for more details.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$output->error($errorMessages);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $process->getExitCode();
|
return $process->getExitCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
private function createPhpProcessBuilder(OutputInterface $output, $address, $router, $env)
|
private function createPhpProcessBuilder(SymfonyStyle $output, $address, $router, $env)
|
||||||
{
|
{
|
||||||
$router = $router ?: $this
|
$router = $router ?: $this
|
||||||
->getContainer()
|
->getContainer()
|
||||||
@ -152,7 +157,7 @@ EOF
|
|||||||
;
|
;
|
||||||
|
|
||||||
if (!file_exists($router)) {
|
if (!file_exists($router)) {
|
||||||
$output->writeln(sprintf('<error>The given router script "%s" does not exist</error>', $router));
|
$output->error(sprintf('The given router script "%s" does not exist.', $router));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -161,7 +166,7 @@ EOF
|
|||||||
$finder = new PhpExecutableFinder();
|
$finder = new PhpExecutableFinder();
|
||||||
|
|
||||||
if (false === $binary = $finder->find()) {
|
if (false === $binary = $finder->find()) {
|
||||||
$output->writeln('<error>Unable to find PHP binary to run server</error>');
|
$output->error('Unable to find PHP binary to run server.');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -11,11 +11,11 @@
|
|||||||
|
|
||||||
namespace Symfony\Bundle\FrameworkBundle\Command;
|
namespace Symfony\Bundle\FrameworkBundle\Command;
|
||||||
|
|
||||||
use Symfony\Component\Console\Question\ConfirmationQuestion;
|
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
use Symfony\Component\Console\Input\InputOption;
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||||
use Symfony\Component\Process\PhpExecutableFinder;
|
use Symfony\Component\Process\PhpExecutableFinder;
|
||||||
use Symfony\Component\Process\Process;
|
use Symfony\Component\Process\Process;
|
||||||
|
|
||||||
@ -74,11 +74,15 @@ EOF
|
|||||||
*/
|
*/
|
||||||
protected function execute(InputInterface $input, OutputInterface $output)
|
protected function execute(InputInterface $input, OutputInterface $output)
|
||||||
{
|
{
|
||||||
if (!extension_loaded('pcntl')) {
|
$output = new SymfonyStyle($input, $output);
|
||||||
$output->writeln('<error>This command needs the pcntl extension to run.</error>');
|
|
||||||
$output->writeln('You can either install it or use the <info>server:run</info> command instead to run the built-in web server.');
|
|
||||||
|
|
||||||
if ($this->getHelper('question')->ask($input, $output, new ConfirmationQuestion('Do you want to start <info>server:run</info> immediately? [Yn] ', true))) {
|
if (!extension_loaded('pcntl')) {
|
||||||
|
$output->error(array(
|
||||||
|
'This command needs the pcntl extension to run.',
|
||||||
|
'You can either install it or use the "server:run" command instead to run the built-in web server.',
|
||||||
|
));
|
||||||
|
|
||||||
|
if ($output->ask('Do you want to execute <info>server:run</info> immediately? [Yn] ', true)) {
|
||||||
$command = $this->getApplication()->find('server:run');
|
$command = $this->getApplication()->find('server:run');
|
||||||
|
|
||||||
return $command->run($input, $output);
|
return $command->run($input, $output);
|
||||||
@ -94,7 +98,7 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!is_dir($documentRoot)) {
|
if (!is_dir($documentRoot)) {
|
||||||
$output->writeln(sprintf('<error>The given document root directory "%s" does not exist</error>', $documentRoot));
|
$output->error(sprintf('The given document root directory "%s" does not exist.', $documentRoot));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -112,32 +116,34 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!$input->getOption('force') && $this->isOtherServerProcessRunning($address)) {
|
if (!$input->getOption('force') && $this->isOtherServerProcessRunning($address)) {
|
||||||
$output->writeln(sprintf('<error>A process is already listening on http://%s.</error>', $address));
|
$output->error(array(
|
||||||
$output->writeln(sprintf('<error>Use the --force option if the server process terminated unexpectedly to start a new web server process.</error>'));
|
sprintf('A process is already listening on http://%s.', $address),
|
||||||
|
'Use the --force option if the server process terminated unexpectedly to start a new web server process.',
|
||||||
|
));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('prod' === $env) {
|
if ('prod' === $env) {
|
||||||
$output->writeln('<error>Running PHP built-in server in production environment is NOT recommended!</error>');
|
$output->error('Running PHP built-in server in production environment is NOT recommended!');
|
||||||
}
|
}
|
||||||
|
|
||||||
$pid = pcntl_fork();
|
$pid = pcntl_fork();
|
||||||
|
|
||||||
if ($pid < 0) {
|
if ($pid < 0) {
|
||||||
$output->writeln('<error>Unable to start the server process</error>');
|
$output->error('Unable to start the server process.');
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($pid > 0) {
|
if ($pid > 0) {
|
||||||
$output->writeln(sprintf('<info>Web server listening on http://%s</info>', $address));
|
$output->success(sprintf('Web server listening on http://%s', $address));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (posix_setsid() < 0) {
|
if (posix_setsid() < 0) {
|
||||||
$output->writeln('<error>Unable to set the child process as session leader</error>');
|
$output->error('Unable to set the child process as session leader');
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -152,7 +158,7 @@ EOF
|
|||||||
touch($lockFile);
|
touch($lockFile);
|
||||||
|
|
||||||
if (!$process->isRunning()) {
|
if (!$process->isRunning()) {
|
||||||
$output->writeln('<error>Unable to start the server process</error>');
|
$output->error('Unable to start the server process');
|
||||||
unlink($lockFile);
|
unlink($lockFile);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -174,11 +180,11 @@ EOF
|
|||||||
*
|
*
|
||||||
* @param string|null $router File path of the custom router script, if set by the user; otherwise null
|
* @param string|null $router File path of the custom router script, if set by the user; otherwise null
|
||||||
* @param string $env The application environment
|
* @param string $env The application environment
|
||||||
* @param OutputInterface $output An OutputInterface instance
|
* @param SymfonyStyle $output An SymfonyStyle instance
|
||||||
*
|
*
|
||||||
* @return string|bool The absolute file path of the router script, or false on failure
|
* @return string|bool The absolute file path of the router script, or false on failure
|
||||||
*/
|
*/
|
||||||
private function determineRouterScript($router, $env, OutputInterface $output)
|
private function determineRouterScript($router, $env, SymfonyStyle $output)
|
||||||
{
|
{
|
||||||
if (null === $router) {
|
if (null === $router) {
|
||||||
$router = $this
|
$router = $this
|
||||||
@ -189,7 +195,7 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (false === $path = realpath($router)) {
|
if (false === $path = realpath($router)) {
|
||||||
$output->writeln(sprintf('<error>The given router script "%s" does not exist</error>', $router));
|
$output->error(sprintf('The given router script "%s" does not exist.', $router));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -200,18 +206,18 @@ EOF
|
|||||||
/**
|
/**
|
||||||
* Creates a process to start PHP's built-in web server.
|
* Creates a process to start PHP's built-in web server.
|
||||||
*
|
*
|
||||||
* @param OutputInterface $output A OutputInterface instance
|
* @param SymfonyStyle $output A SymfonyStyle instance
|
||||||
* @param string $address IP address and port to listen to
|
* @param string $address IP address and port to listen to
|
||||||
* @param string $documentRoot The application's document root
|
* @param string $documentRoot The application's document root
|
||||||
* @param string $router The router filename
|
* @param string $router The router filename
|
||||||
*
|
*
|
||||||
* @return Process The process
|
* @return Process The process
|
||||||
*/
|
*/
|
||||||
private function createServerProcess(OutputInterface $output, $address, $documentRoot, $router)
|
private function createServerProcess(SymfonyStyle $output, $address, $documentRoot, $router)
|
||||||
{
|
{
|
||||||
$finder = new PhpExecutableFinder();
|
$finder = new PhpExecutableFinder();
|
||||||
if (false === $binary = $finder->find()) {
|
if (false === $binary = $finder->find()) {
|
||||||
$output->writeln('<error>Unable to find PHP binary to start server</error>');
|
$output->error('Unable to find PHP binary to start server.');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ namespace Symfony\Bundle\FrameworkBundle\Command;
|
|||||||
use Symfony\Component\Console\Input\InputArgument;
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shows the status of a process that is running PHP's built-in web server in
|
* Shows the status of a process that is running PHP's built-in web server in
|
||||||
@ -42,6 +43,7 @@ class ServerStatusCommand extends ServerCommand
|
|||||||
*/
|
*/
|
||||||
protected function execute(InputInterface $input, OutputInterface $output)
|
protected function execute(InputInterface $input, OutputInterface $output)
|
||||||
{
|
{
|
||||||
|
$output = new SymfonyStyle($input, $output);
|
||||||
$address = $input->getArgument('address');
|
$address = $input->getArgument('address');
|
||||||
|
|
||||||
// remove an orphaned lock file
|
// remove an orphaned lock file
|
||||||
@ -50,9 +52,9 @@ class ServerStatusCommand extends ServerCommand
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (file_exists($this->getLockFile($address))) {
|
if (file_exists($this->getLockFile($address))) {
|
||||||
$output->writeln(sprintf('<info>Web server still listening on http://%s</info>', $address));
|
$output->success(sprintf('Web server still listening on http://%s', $address));
|
||||||
} else {
|
} else {
|
||||||
$output->writeln(sprintf('<error>No web server is listening on http://%s</error>', $address));
|
$output->warning(sprintf('No web server is listening on http://%s', $address));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ use Symfony\Component\Console\Input\InputArgument;
|
|||||||
use Symfony\Component\Console\Input\InputInterface;
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
use Symfony\Component\Console\Input\InputOption;
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stops a background process running PHP's built-in web server.
|
* Stops a background process running PHP's built-in web server.
|
||||||
@ -54,6 +55,8 @@ EOF
|
|||||||
*/
|
*/
|
||||||
protected function execute(InputInterface $input, OutputInterface $output)
|
protected function execute(InputInterface $input, OutputInterface $output)
|
||||||
{
|
{
|
||||||
|
$output = new SymfonyStyle($input, $output);
|
||||||
|
|
||||||
$address = $input->getArgument('address');
|
$address = $input->getArgument('address');
|
||||||
if (false === strpos($address, ':')) {
|
if (false === strpos($address, ':')) {
|
||||||
$address = $address.':'.$input->getOption('port');
|
$address = $address.':'.$input->getOption('port');
|
||||||
@ -62,12 +65,12 @@ EOF
|
|||||||
$lockFile = $this->getLockFile($address);
|
$lockFile = $this->getLockFile($address);
|
||||||
|
|
||||||
if (!file_exists($lockFile)) {
|
if (!file_exists($lockFile)) {
|
||||||
$output->writeln(sprintf('<error>No web server is listening on http://%s</error>', $address));
|
$output->error(sprintf('No web server is listening on http://%s', $address));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
unlink($lockFile);
|
unlink($lockFile);
|
||||||
$output->writeln(sprintf('<info>Stopped the web server listening on http://%s</info>', $address));
|
$output->success(sprintf('Stopped the web server listening on http://%s', $address));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user