1

我编写记录器配置并使用 Zend\Log\LoggerServiceFactory 来配置记录器。如果我使用基础作家所有工作。但是我想将我自己由工厂创建的作家添加到记录器中,这是行不通的。

有没有办法使用配置和基本记录器工厂从自己的工厂添加编写器?

更新:这是我的代码

这是我的配置,我为 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 编写器,此配置可以满足我的需要 - 创建和配置标准编写器。

因此,我从 aontroller 调用 logger:

$this->getServiceLocator()->get('Logger')->info('test');
4

2 回答 2

0

我研究了组件代码,没有找到使用工厂创建自己的作家的方法。不幸的是,目前这是不可能的。

于 2013-05-09T12:08:35.497 回答
0

我想我找到了解决方案。解决方案不是很好,但我想通了。

\Zend\Log\LoggerServiceFactory我为标准工厂(另外,我添加了对 writer factory 的检查。

这是生成的类:

<?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;
    }
}

有人可以提出更好的解决方案吗?

于 2013-05-09T12:47:31.477 回答