В документации по компоненту Консоль описано, как создать консольную команду. В этой же статье рассказывается, как использовать консольную команду прямо с вашего контроллера.
Вам может потребоваться выполнить некоторую функцию, которая доступна только в консольной команде. Как правило, вам следует отрефакторить команду и переместить некоторую логику в сервис, которую можно повторно использовать в контроллере.
Однако, когда команда является частью сторонней библиотеки, вы не захотите изменять или дублировать их код. Вместо этого вы можете выполнить команду напрямую.
По сравнению с прямым вызовом из консоли, вызов команды из контроллера имеет небольшое влияние на производительность из-за дополнительных накладных расходов на ресурсы.
Представьте, что вы хотите отправлять отложенные сообщения Swift Mailer с помощью команды swiftmailer:spool:send. Запустите эту команду из вашего контроллера, следующим образом:
<?php
// src/Controller/SpoolController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelInterface;
class SpoolController extends AbstractController
{
public function sendSpool($messages = 10, KernelInterface $kernel)
{
$application = new Application($kernel);
$application->setAutoExit(false);
$input = new ArrayInput([
'command' => 'swiftmailer:spool:send',
// (опционально) определение значений аргументов команды
'fooArgument' => 'barValue',
// (опционально) передача параметров в консольную команду
'--message-limit' =; $messages,
]);
// Вы можете использовать NullOutput() если не желаете выводить данные из команды
$output = new BufferedOutput();
$application->run($input, $output);
// возвращаете вывод из команды, не используйте, если вы использовали NullOutput()
$content = $output->fetch();
// укажите return new Response(""), если ранее вы использовали пустой вывод NullOutput()
return new Response($content);
}
}