1

我有一个ZendFramework 应用程序。它正在运行 Zend Framework 3。我添加了 zend-log,并将其注入到IndexController 的构造函数中,我在索引控制器的索引操作中记录了一条消息,如下所示。

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' => [ . . . ] ]模块配置中吗?我应该把我写的工厂类放在哪里?在与其他服务?

我正在努力以“正确”的方式解决这个问题。

4

1 回答 1

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");
    }
}
于 2017-02-28T05:00:58.817 回答