Как настроить фабрику ZendLog по умолчанию для приложения Zend Framework MVC?

У меня есть приложение ZendFramework. На нем работает Zend Framework 3. Я добавил zend-log и внедрил его в конструктор IndexController Я регистрирую сообщение в действии index контроллера индекса вот так.

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' => [ . . . ] ] в конфигурации модуля? Где я должен разместить фабричный класс, который я пишу? С другими службами?

Я изо всех сил пытаюсь решить это "правильным" способом.


person Justin Dearing    schedule 26.02.2017    source источник
comment
Вы создаете Logger Factory? Можете ли вы вставить фабрики для контроллера и регистратора.   -  person tasmaniski    schedule 27.02.2017


Ответы (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");
    }
}
person akond    schedule 28.02.2017
comment
Это именно то, что я хочу. - person Justin Dearing; 28.02.2017