2017-02-26 39 views
1

我有一個ZendFramework application。它運行Zend Framework 3.我添加了zend-log,並將它注入到constructor of the IndexController中,我在索引控制器的索引操作中記錄了一條消息,如下所示。如何爲Zend Framework MVC應用程序配置默認的ZendLog工廠?

public function __construct(Logger $logger) 
{ 
    $this->logger = $logger; 
} 

public function indexAction() 
{ 
    $this->logger->info('Example Log Message'); 
    return new ViewModel(); 
} 

我可以用vendor/bin/generate-factory-for-class爲此生成一個工廠。我像這樣將它添加到模塊配置中。

'controllers' => [ 
    'factories' => [ 
     Controller\IndexController::class => Controller\IndexControllerFactory::class, 
    ], 
], 

當我運行指標控制器我收到以下錯誤:

/var/www/vendor/zendframework/zend-log/src/Logger.php:434 
No log writer specified 

我知道我可以用下面添加一個作家:

$logger->addWriter($writer); 

我的問題是,什麼是記錄器支持配置?我只是將它添加到模塊配置中的['service_manager' => 'factories' => [ . . . ] ]?我應該把我寫的工廠課程放在哪裏?與其他服務?

我正在努力解決這個「正確」的方式。

+0

是您創建的記錄器廠?你可以粘貼控制器和記錄器工廠嗎? – tasmaniski

回答

1

通常,記錄器配置保存在module.config.php。但可以肯定的是,它可以位於其他地方。沒有正確的方法,但不知道你想要達到什麼,我建議你遵循傳統。

添加到您的module.config.php

'service_manager' => [ 
    'factories' => [ 
     'log' => \Zend\Log\LoggerServiceFactory::class, 
    ], 
], 

'log' => [ 
    'writers' => [ 
     [ 
      'name' => 'stream', 
      'options' => [ 
       'stream' => "test.log" 
      ] 
     ] 
    ] 
] 

你的控制器工廠可能是這樣的:

class IndexControllerFactory implements FactoryInterface 
{ 
    public function __invoke (ContainerInterface $container, $requestedName, array $options = null) 
    { 
     $indexController = new IndexController(); 
     $indexController->setLogger ($container->get ('log')); 

     return $indexController; 
    } 
} 

和控制器本身:

use Zend\Log\LoggerAwareInterface; 
use Zend\Log\LoggerAwareTrait; 
use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class IndexController extends AbstractActionController implements LoggerAwareInterface 
{ 
    use LoggerAwareTrait; 

    public function testAction() 
    { 
     $this->logger->info("test"); 
    } 
} 
+0

這幾乎就是我想要的。 –

相關問題