控制臺(tái)組件文檔講解了如何創(chuàng)建控制臺(tái)命令。本指導(dǎo)文章將會(huì)講解如何直接從 Controller 調(diào)用一個(gè)控制臺(tái)命令。
你可能有執(zhí)行只有在控制臺(tái)命令中可用的某些功能的需要。通常情況下,你應(yīng)該重構(gòu)命令然后向服務(wù)中移動(dòng)一些能夠在 controller 中應(yīng)用的邏輯。然而,當(dāng)命令是第三方函數(shù)庫(kù)的一部分時(shí),你就會(huì)不想修正或者復(fù)制它們的代碼。作為替代你可以直接執(zhí)行命令。
和直接從控制臺(tái)的直接調(diào)用相比,由于請(qǐng)求堆??傞_銷,所以從 controller 調(diào)用命令稍微有一些性能上的影響。
試想你想要將假脫機(jī)的 Swift Mailer 的信息通過(guò)使用 swiftmailer:spool:send 命令發(fā)送。通過(guò)下列代碼從你的 controller 的內(nèi)部運(yùn)行這個(gè)命令:
// src/AppBundle/Controller/SpoolController.php
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\HttpFoundation\Response;
class SpoolController extends Controller
{
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,
));
// You can use NullOutput() if you don't need the output
$output = new BufferedOutput();
$application->run($input, $output);
// return the output, don't use if you used NullOutput()
$content = $output->fetch();
// return new Response(""), if you used NullOutput()
return new Response($content);
}
}
通過(guò)第二個(gè)參數(shù)告訴 BufferedOutput 這是可以裝飾的,這將會(huì)返回 Ansi 顏色編碼內(nèi)容。 SensioLabs AnsiToHtml 轉(zhuǎn)換器可以用于將這個(gè)轉(zhuǎn)化成彩色的 HTML。
首先,請(qǐng)求包:
$ composer require sensiolabs/ansi-to-html
現(xiàn)在在你的 controller 中應(yīng)用:
// src/AppBundle/Controller/SpoolController.php
namespace AppBundle\Controller;
use SensioLabs\AnsiConverter\AnsiToHtmlConverter;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\HttpFoundation\Response;
// ...
class SpoolController extends Controller
{
public function sendSpoolAction($messages = 10)
{
// ...
$output = new BufferedOutput(
OutputInterface::VERBOSITY_NORMAL,
true // true for decorated
);
// ...
// return the output
$converter = new AnsiToHtmlConverter();
$content = $output->fetch();
return new Response($converter->convert($content));
}
}
AnsiToHtmlConverter 也可以注冊(cè)成為 Twig 擴(kuò)展,并且支持可選的主題。