如何解决如何在 Symfony 中获取所有 Monolog 记录器的集合?
我有一个创建不同对象的工厂类,我为每种类型的对象定义了很多记录器。 我想在我的工厂收集所有记录器。之前我只是在我的工厂构造函数中使用了 ContainerInterface,但由于 Symfony 5.1 容器自动装配已被弃用。 现在我找不到获取记录器集合的方法。我尝试使用
!tagged_iterator { tag: 'monolog.logger' }
并且还尝试为 LoggerInterface 设置标签并为其获取 tagged_iterator,但没有成功。我建议这是因为记录器不是真正的类。
解决方法
这可能有点矫枉过正,但正如您所说,记录器服务有点不寻常。似乎它们应该被 LoggerInterface 标记或可以标记,但我运行了一些测试并且无法让它工作。这是一种暴力方法,它依赖于具有 monolog.logger.name id 的记录器服务:
# Start with a service locator class
namespace App\Service;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ServiceLocator;
class LoggerLocator extends ServiceLocator
{
// Just to specify the return type to keep IDEs happy
public function get($id) : LoggerInterface
{
return parent::get($id);
}
}
...
# now make the kernel into a compiler pass
# src/Kernel.php
class Kernel extends BaseKernel implements CompilerPassInterface
...
public function process(ContainerBuilder $container)
{
$loggerServices = [];
foreach($container->getServiceIds() as $id) {
if (!strncmp($id,'monolog.logger.',15)) {
//echo 'Logger ' . $id . "\n";
$loggerServices[$id] = new Reference($id);
}
}
$loggerLocator = $container->getDefinition(LoggerLocator::class);
$loggerLocator->setArguments([$loggerServices]);
}
# and now we can inject the locator where it is needed
class SomeController {
public function index(Request $request,LoggerLocator $loggerLocator)
{
dump($loggerLocator);
$logger = $loggerLocator->get('monolog.logger.' . $name);
似乎应该有一种方法可以通过配置来做到这一点,但我想通过很容易。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。