在Doctrine Fixtures Load中访问命令OutputInterface

时间:2014-08-14 12:17:41

标签: php symfony doctrine-orm command

我使用了很棒的Faker Library生成了大量的数据夹具,同时使用lorempixel.com在我的Symfony2项目中生成了一些随机图像。这需要一些时间(目前约10分钟),所以我想知道是否可以通过容器界面以某种方式访问​​命令输出接口并以这种方式打印进度而不是echo'ing所有内容..

也许还可以使用ProgressBar

获得良好的输出

2 个答案:

答案 0 :(得分:6)

看起来ConsoleOutput不需要任何特殊的东西,可以直接实例化。

use Symfony\Component\Console\Output\ConsoleOutput;

// ...

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

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

答案 1 :(得分:1)

如果使用$output事件获得“原始” ConsoleEvents::COMMAND对象,则可能是更好的解决方案。

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'