Skip to content

Commit

Permalink
Documentation about using Command in Controller
Browse files Browse the repository at this point in the history
... and color coding Ansi output using SensioLabs AnsiToHtml

Documentation about using Command in Controller

... and color coding Ansi output using SensioLabs AnsiToHtml

Line syntax

Change component link

Update command_in_controller.rst

with real world example about Swift Mailer.

Update command_in_controller.rst

Added command_in_controller to map.rst.inc

Update map.rst.inc

Documentation about using Command in Controller

Update command_in_controller.rst
  • Loading branch information
rvanlaak committed Mar 12, 2015
1 parent d3192a7 commit cf5860f
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 0 deletions.
94 changes: 94 additions & 0 deletions cookbook/console/command_in_controller.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
.. index::
single: Console; Use commands in your Controller

How to Call a Command from a Controller
=======================================

The :doc:`Console component documentation </components/console/introduction>` covers
how to create a console command. This cookbook article covers how to use a console command
directly in your application.

You may have the need to execute some function that is only available in a console command.
Usually, you should refactor the command and move some logic into a service that can be
reused in the controller. However, when the command is part of a third-party library, you
wouldn't want to modify or duplicate their code, but want to directly execute the command
instead.

An example of this is sending the emails that Swift Mailer spooled earlier
:doc:`using the swiftmailer:spool:send command </cookbook/email/spool>`. Symfony
allows you to directly execute a registered ``Command`` inside your Controller::

// src/AcmeBundle/Controller/SpoolController.php
namespace AcmeBundle\Controller;

use Symfony\Component\Console\Output\StreamOutput;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Bundle\FrameworkBundle\Console\Application;

class SpoolController
{
public function sendSpoolAction($messages=10)
{
$kernel = $this->get('kernel');
$application = new Application($kernel);
$application->setAutoExit(false);

$input = new ArrayInput(array(
'command' => 'swiftmailer:spool:send',
'--message-limit' => $messages,
));
$output = new StreamOutput(tmpfile(), StreamOutput::VERBOSITY_NORMAL);
$application->run($input, $output);

rewind($output->getStream());
$content = stream_get_contents($output->getStream());
fclose($output->getStream());

return $content;
}
}

Showing Colorized Command Output
--------------------------------

By telling the ``StreamOutput`` it is decorated via the third parameter, it will return
the Ansi color-coded content. The `SensioLabs AnsiToHtml converter`_ can be required
using ``Composer`` and helps you to get colorful html::

// src/AppBundle/Controller/SpoolController.php
namespace AppBundle\Controller;

use Symfony\Component\Console\Output\StreamOutput;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use SensioLabs\AnsiConverter\AnsiToHtmlConverter;

class SpoolController
{
public function sendSpoolAction($messages=10)
{
$kernel = $this->get('kernel');
$application = new Application($kernel);
$application->setAutoExit(false);

$input = new ArrayInput(array(
'command' => 'swiftmailer:spool:send',
'--message-limit' => $messages,
));
$output = new StreamOutput(tmpfile(), StreamOutput::VERBOSITY_NORMAL, true);
$application->run($input, $output);

rewind($output->getStream());
$content = stream_get_contents($output->getStream());
fclose($output->getStream());

$converter = new AnsiToHtmlConverter();
return $converter->convert($content);
}
}

The ``AnsiToHtmlConverter`` can also be registered `as a Twig Extension`_,
and supports optional themes.

.. _`SensioLabs AnsiToHtml converter`: https://github.com/sensiolabs/ansi-to-html
.. _`as a Twig Extension`: https://github.com/sensiolabs/ansi-to-html#twig-integration
1 change: 1 addition & 0 deletions cookbook/console/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Console

console_command
usage
command_in_controller
sending_emails
logging
commands_as_services
1 change: 1 addition & 0 deletions cookbook/map.rst.inc
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@

* :doc:`/cookbook/console/console_command`
* :doc:`/cookbook/console/usage`
* :doc:`/cookbook/console/command_in_controller`
* :doc:`/cookbook/console/sending_emails`
* :doc:`/cookbook/console/logging`
* :doc:`/cookbook/console/commands_as_services`
Expand Down

0 comments on commit cf5860f

Please sign in to comment.