如何为 Zend Framework MVC 应用程序配置默认的 ZendLog 工厂?
How do I configure the default ZendLog factory for a Zend Framework MVC app?
我有一个 ZendFramework application. Its running Zend Framework 3. I added zend-log, and injected it into the constructor of the 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' => [ . . . ] ]
吗?我写的工厂class应该放在哪里?与其他服务一起使用?
我正在努力以 "right" 的方式解决这个问题。
通常,记录器配置保存在 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");
}
}
我有一个 ZendFramework application. Its running Zend Framework 3. I added zend-log, and injected it into the constructor of the 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' => [ . . . ] ]
吗?我写的工厂class应该放在哪里?与其他服务一起使用?
我正在努力以 "right" 的方式解决这个问题。
通常,记录器配置保存在 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");
}
}