РЕДАКТИРОВАТЬ: SymfonyStyle
фактически использует только Input
, но не позволяет получить к нему доступ.Для чего вам нужно Input
?Вы должны использовать только переменные, которые он предоставляет за пределами Command
.
Итак, в основном вам нужны Input
и Output
в качестве службы ?
Класс, объединяющий их, называется SymfonyStyle
, и он был представлен в Symfony 2.8 с хорошим постом в блоге .
Существует множество способов получить ввод / вывод в SymfonyStyle
, но я покажу вам самый простой.Я использую его в пакетах Symplify и Rector более 3 лет, и это очень надежно.
<?php declare(strict_types=1);
namespace App\Console;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Style\SymfonyStyle;
final class SymfonyStyleFactory
{
public function create(): SymfonyStyle
{
$input = new ArgvInput();
$output = new ConsoleOutput();
return new SymfonyStyle($input, $output);
}
}
Затем зарегистрируйте этот завод как сервис:
# app/config/services.yaml
services:
App\Console\SymfonyStyleFactory: ~
Symfony\Component\Console\Style\SymfonyStyle:
factory: ['@App\Console\SymfonyStyleFactory', 'create']
Тогда просто потребуйте SymfonyStyle
в любом сервисе, в котором он вам нужен, и используйте его:
<?php declare(strict_types=1);
class MessageManager
{
/**
* @var SymfonyStyle
*/
private $symfonyStyle;
public function __construct(SymfonyStyle $symfonyStyle)
{
$this->symfonStyle = $symfonyStyle;
}
public function run()
{
// some code
$this->symfonyStyle->writeln('It works!');
// some code
}
}