2013-05-07 74 views
1

我寫logger config並使用Zend \ Log \ LoggerServiceFactory來配置Logger。如果我使用基本作家所有的工作。但我想添加一個記錄器,我自己的作家是由工廠創建的,這是不起作用的。有沒有辦法將日誌記錄器工廠添加到日誌記錄器配置中?

有沒有辦法使用的配置和基本記錄器工廠從自己的工廠添加作家的方法嗎?

更新:這裏是我的代碼

這是我的配置,我定義工廠記錄儀,工廠作家和CONFIGS爲基地的作家

// 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 - it`sa工廠從yassa \翻車防護模塊(github

沒有ROLLBAR作家這個配置做什麼,我需要 - 創建和配置非標準作家。

因此,我調用記錄從aontroller:

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

也許你可以告訴我們一些代碼來幫助你 – 2013-05-07 08:56:07

+0

我對延遲表示歉意。添加代碼示例 – 2013-05-07 16:31:40

回答

0

我想我找到了解決方案。該解決方案不是很好,但沒有更好的我明白了。

我寫的標準廠房(\Zend\Log\LoggerServiceFactory)和轉移記錄器配置從我廠的記錄器的構造的替代品。另外,我爲作家工廠添加了一張支票。

下面是結果類:

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

任何人可以提出一個更好的解決方案嗎?

0

我研究了組件代碼,並沒有找到一種方法,使用工廠來創建自己的作家。不幸的是,目前這是不可能的。

相關問題