Журнал Slimphp из промежуточного программного обеспечения

У меня есть следующая настройка в проекте Slim PHP с использованием Monolog для ведения журнала, но я не могу войти из промежуточного программного обеспечения.

В зависимостях.php у меня есть

$container['logger'] = function ($c) {
    $settings = $c->get('settings')['logger'];
    $logger = new Monolog\Logger($settings['name']);
    $logger->pushProcessor(new Monolog\Processor\UidProcessor());
    $logger->pushHandler(new Monolog\Handler\StreamHandler($settings['path'], $settings['level']));
    return $logger;
};

Затем в middleware.php у меня есть

use App\Middleware\Logging;
$app->add(new Logging($container->logger));

С App \ Middleware \ Logging:

<?php

namespace App\Middleware;

class Logging
{

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

public function __invoke($request, $response, $next)
{
    $routeParams = $request->getAttribute('routeInfo')[2];
    $this->logger->info($request->getMethod() . " -- " . $request->getUri());
    return $next($request, $response);
}
}

Как я могу затем войти в систему из другого файла промежуточного программного обеспечения?

У меня также есть приложение / промежуточное ПО / CacheMiddleware

<?php

namespace  App\Middleware;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

class CacheMiddleware
{
public function __invoke(RequestInterface $request, ResponseInterface $response, callable $next)
{
    //$this->logger->info('test');
    $response->getBody()->write('BEFORE');
    return $next($request, $response);
}
}

Но выдает ошибку Call to a member function info() on null

Любая помощь была бы замечательной.

Спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
573
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем коде класс CacheMiddleware не имеет члена $logger. В классе Logging вы передаете экземпляр регистратора в конструктор и соответственно устанавливаете $this->logger, но в CacheMiddleware вы этого не делаете. Сделайте то же самое в другом классе:

class CacheMiddleware
{

    public function __construct($logger)
        {
            $this->logger = $logger;
        }
    // rest of class definition
}

и когда вы добавляете новый экземпляр CacheMiddleware в промежуточное ПО приложения, передайте $container['logger'] конструктору, как вы это делали с $app->add(new Logging($container->logger));:

$app->add(new CacheMiddleware($container->logger));

Другие вопросы по теме