我使用很棒的 Faker Library 生成大量数据固定装置,还使用 lorempixel.com 在我的 Symfony2 项目中添加一些随机图像。这需要一些时间(目前大约 10 分钟),所以我想知道是否可以通过容器接口以某种方式访问 Command OutputInterface 并以这种方式打印进度,而不是
echo'ing
一切..
也许还可以通过 ProgressBar
获得不错的输出看起来ConsoleOutput不需要什么特殊的东西,直接实例化即可。
use Symfony\Component\Console\Output\ConsoleOutput;
// ...
public function load(ObjectManager $manager)
{
$output = new ConsoleOutput();
$output->writeln('<info>this works... </info>');
}
如果您使用
$output
事件获得“原始”ConsoleEvents::COMMAND
对象,也许会有更好的解决方案。
使用 php 属性编辑 2024-05-05 代码(在此示例中未设置
$this->command
):
namespace App\DataFixtures;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
#[AsEventListener(event: ConsoleEvents::COMMAND, method: 'init')]
class CustomFixture extends Fixture
{
private SymfonyStyle $io;
private OutputInterface $output;
public function init(ConsoleCommandEvent $event): void
{
$this->output = $event->getOutput();
$this->io = new SymfonyStyle($event->getInput(), $this->output);
}
public function load(ObjectManager $manager): void
{
$this->io->info('hello world');
}
}
旧代码:
namespace App\DoctrineFixtures;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CustomFixture extends AbstractFixture implements EventSubscriberInterface
{
/** @var OutputInterface */
private $output;
/** @var Command */
private $command;
public static function getSubscribedEvents()
{
return [
ConsoleEvents::COMMAND => 'init',
];
}
public function init(ConsoleCommandEvent $event): void
{
$this->output = $event->getOutput();
$this->command = $event->getCommand();
}
public function load(ObjectManager $manager)
{
// ...
$this->output->writeln('...');
// ...
$tableHelper = $this->command->getHelper('table');
// ...
$progressBar = new ProgressBar($this->output, 50);
// ...
}
}
在
services.yml
:
services:
App\DoctrineFixtures\CustomFixture:
tags:
- 'doctrine.fixture.orm'
- 'kernel.event_subscriber'