访问 Doctrine 夹具加载中的命令输出接口

问题描述 投票:0回答:2

我使用很棒的 Faker Library 生成大量数据固定装置,还使用 lorempixel.com 在我的 Symfony2 项目中添加一些随机图像。这需要一些时间(目前大约 10 分钟),所以我想知道是否可以通过容器接口以某种方式访问 Command OutputInterface 并以这种方式打印进度,而不是

echo'ing
一切..

也许还可以通过 ProgressBar

获得不错的输出
php symfony doctrine-orm command
2个回答
12
投票

看起来ConsoleOutput不需要什么特殊的东西,直接实例化即可。

use Symfony\Component\Console\Output\ConsoleOutput;

// ...

public function load(ObjectManager $manager)
{
    $output = new ConsoleOutput();

    $output->writeln('<info>this works... </info>');
} 

3
投票

如果您使用

$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'
© www.soinside.com 2019 - 2024. All rights reserved.