委派给服务的操作的进度

The progress of the operation delegated to the service

提问人:Tomasz Filipek 提问时间:1/23/2023 更新时间:1/23/2023 访问量:39

问:

在 Symfony 中,我想创建一个命令,当调用该命令时,它将从服务运行该方法 - 所有操作都将在那里执行。 我希望用户能够看到操作的进度。

因此,从服务方法中,我需要从命令访问 ProgressBar。

在互联网上,我找到了一个解决方案,包括向将在进度条上运行的服务发送回调。 像这样的东西:

// service method
public function update(\Closure $callback = null)
{
    $validCountryCodes = $this->countryRepository->findAll();

    $products = $this->productRepository->findWithInvalidCountryCode($validCountryCodes);

    foreach ($products as $product) {
        if ($callback) {
            $callback($product);
        }
        ...
    }
}

/**
 * command file
 */
public function execute(InputInterface $input, OutputInterface $output)
{
    $progress = new ProgressBar($output, 50);

    $progress->start();

    $callback = function ($product) use ($progress) {
        $progress->advance();
    };
    $this->getContainer()->get('update.product.countries')->update($callback);
}

它有效,但问题是在服务中,操作被拆分为许多方法。 问题是如何使传递给更新方法的回调可用于servie中的所有方法?

我可以将它作为参数传递给我运行的每个方法,但这看起来不是很优雅......

提前感谢您的帮助。 问候

PHP symfony 回调

评论

0赞 Cerad 1/23/2023
为什么 Service::update 不能将 $callback 存储为属性,然后可以从需要它的任何其他 Service 方法访问该属性?
0赞 Tomasz Filipek 1/23/2023
@Cerad这就是我想要的。但是我不知道如何将更新方法的参数中传递$callback传递给服务类的全局属性。
1赞 Cerad 1/23/2023
嗯。不完全确定你根据发布的代码问什么,但将服务耦合到进度条(甚至使用回调)似乎有点问题。请考虑让服务发出自定义事件,然后让命令将自身注册为事件侦听器。
0赞 Tomasz Filipek 1/25/2023
@Cerad 带有事件侦听器的解决方案可以解决问题。谢谢!

答: 暂无答案