我编写了logger config并使用Zend \ Log \ LoggerServiceFactory来配置Logger。如果我使用基础编写器都可以工作。但是我想添加一个记录器,我自己的作者是由工厂创建的,这不是工作。
有没有办法使用config和base logger factory从自己的工厂添加编写器?
更新:这是我的代码
这是我的配置,我为Logger定义工厂,为编写器定义工厂,为基础编写器定义配置
// config/autoload/global.php
return array(
'service_manager' => array(
'factories' => array(
'Logger' => 'Zend\Log\LoggerServiceFactory',
'Rollbar' => 'Yassa\Rollbar\Log\Writer\Rollbar'
),
),
'log' => array(
'writers' => array(
array(
'name' => 'stream',
'options' => array(
...
),
),
array(
'name' => 'stream',
'options' => array(
...
),
),
array(
'name' => 'Rollbar',
),
),
),
);
Yassa\Rollbar\Log\Writer\Rollbar
- 它是来自yassa \ rollbar模块的工厂(github)
如果没有Rollbar writer,这个配置可以满足我的需求 - 创建和配置标准编写器。
因此我从aontroller调用logger:
$this->getServiceLocator()->get('Logger')->info('test');
答案 0 :(得分:0)
我研究了组件代码,但没有找到使用工厂创建自己的编写器的方法。不幸的是,目前这是不可能的。
答案 1 :(得分:0)
我想我找到了解决方案。解决方案不是很好,但没想到更好。我想出来了。
我为标准工厂(\Zend\Log\LoggerServiceFactory
)写了一个替代品,并从我工厂的Logger构造函数中传输记录器配置。另外,我添加了对作家工厂的检查。
以下是结果类:
<?php
namespace Application\Factory;
use Zend\Log\Exception\InvalidArgumentException;
use Zend\Log\Logger;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class LoggerServiceFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
// Configure the logger
$config = $serviceLocator->get('Config');
$options = isset($config['log']) ? $config['log'] : array();
$logger = new Logger();
if (is_array($options)) {
if (isset($options['writers']) && is_array($options['writers'])) {
foreach ($options['writers'] as $writer) {
if (!isset($writer['name'])) {
throw new InvalidArgumentException('Options must contain a name for the writer');
}
$priority = (isset($writer['priority'])) ? $writer['priority'] : null;
$writerOptions = (isset($writer['options'])) ? $writer['options'] : null;
if ($serviceLocator->has($writer['name'])) {
$writer = $serviceLocator->get($writer['name']);
$logger->addWriter($writer, $priority, $writerOptions);
} else {
$logger->addWriter($writer['name'], $priority, $writerOptions);
}
}
}
if (isset($options['exceptionhandler']) && $options['exceptionhandler'] === true) {
Logger::registerExceptionHandler($logger);
}
if (isset($options['errorhandler']) && $options['errorhandler'] === true) {
Logger::registerErrorHandler($logger);
}
}
return $logger;
}
}
有人能提出更好的解决方案吗?