2017-02-26 60 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

这几乎就是我想要的。 –

相关问题