slimphp / Slim

Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs.
http://slimframework.com
MIT License
11.97k stars 1.95k forks source link

[Question] How to Write ErrorLog with Monolog from Container #2895

Closed eskies closed 4 years ago

eskies commented 4 years ago

I've followed steps from this http://www.slimframework.com/docs/v4/middleware/error-handling.html#error-logging to extends default ErrorHandler and write error message to log file using Monolog. But I cant get the object, I've tried using this class to write with monolog

namespace App\Loader
use Slim\Handlers\ErrorHandler;
use Psr\Log\LoggerInterface;
class CustomErrorHandler extends ErrorHandler
{
    protected function logError(string $error): void
    {
        $logger = $this->callableResolver->resolve(LoggerInterface::class));
    }
}

this my index.php

<?php
declare(strict_types=1);

use DI\ContainerBuilder;
use Slim\Factory\AppFactory;
use Slim\Factory\ServerRequestCreatorFactory;
use Psr\Http\Message\ServerRequestInterface;

require __DIR__ . '/../vendor/autoload.php';

// Instantiate PHP-DI ContainerBuilder
$containerBuilder = new ContainerBuilder();
if (false) { // Should be set to true in production
    $containerBuilder->enableCompilation(__DIR__ . '/../local/cache');
}

// Set up local settings
$localsettings = require __DIR__ . '/../local/settings.php';
$localsettings($containerBuilder);

// Set up global settings
$globalsettings = require __DIR__ . '/../src/Loader/settings.php';
$globalsettings($containerBuilder);

// Set up dependencies
$dependencies = require __DIR__ . '/../src/Loader/dependencies.php';
$dependencies($containerBuilder);

// Build PHP-DI Container instance
$container = $containerBuilder->build();

// Instantiate the app
AppFactory::setContainer($container);
$app = AppFactory::create();

// Register routes
$routes = require __DIR__ . '/../src/Loader/routes.php';
$routes($app);

//Enable error report
$myErrorHandler = new \App\Loader\CustomErrorHandler($app->getCallableResolver(), $app->getResponseFactory());
$errorMiddleware = $app->addErrorMiddleware(true, true, true);
$errorMiddleware->setDefaultErrorHandler($myErrorHandler);
$app->run();

?>

but it say Fatal error: Uncaught RuntimeException: Psr\Log\LoggerInterface is not resolvable

I checked the callableresolver and Psr\Logger is there

object(Slim\CallableResolver)#24 (1) {
  ["container":"Slim\CallableResolver":private]=>
  object(DI\Container)#19 (8) {
    ["resolvedEntries":protected]=>
    array(5) {
      ["DI\Container"]=>
      *RECURSION*
      ["Psr\Container\ContainerInterface"]=>
      *RECURSION*
      ["DI\FactoryInterface"]=>
      *RECURSION*
      ["Invoker\InvokerInterface"]=>
      *RECURSION*
      ["Slim\Error\Renderers\PlainTextErrorRenderer"]=>
      object(Slim\Error\Renderers\PlainTextErrorRenderer)#67 (0) {
      }
    }
    ["definitionSource":"DI\Container":private]=>
    object(DI\Definition\Source\SourceChain)#9 (3) {
      ["sources":"DI\Definition\Source\SourceChain":private]=>
      array(5) {
        [0]=>
        object(DI\Definition\Source\DefinitionArray)#16 (3) {
          ["definitions":"DI\Definition\Source\DefinitionArray":private]=>
          array(0) {
          }
          ["wildcardDefinitions":"DI\Definition\Source\DefinitionArray":private]=>
          array(0) {
          }
          ["normalizer":"DI\Definition\Source\DefinitionArray":private]=>
          object(DI\Definition\Source\DefinitionNormalizer)#17 (1) {
            ["autowiring":"DI\Definition\Source\DefinitionNormalizer":private]=>
            object(DI\Definition\Source\ReflectionBasedAutowiring)#8 (0) {
            }
          }
        }
        [1]=>
        object(DI\Definition\Source\DefinitionArray)#10 (3) {
          ["definitions":"DI\Definition\Source\DefinitionArray":private]=>
          array(2) {
            ["Psr\Log\LoggerInterface"]=>
            object(Closure)#6 (1) {
              ["parameter"]=>
              array(1) {
                ["$c"]=>
                string(10) "<required>"
              }
            }
            ["App\Loader\Illuminate\Database\Capsule\Manager"]=>
            object(Closure)#7 (1) {
              ["parameter"]=>
              array(1) {
                ["$c"]=>
                string(10) "<required>"
              }
            }
          }
          ["wildcardDefinitions":"DI\Definition\Source\DefinitionArray":private]=>
          array(0) {
          }
          ["normalizer":"DI\Definition\Source\DefinitionArray":private]=>
          object(DI\Definition\Source\DefinitionNormalizer)#11 (1) {
            ["autowiring":"DI\Definition\Source\DefinitionNormalizer":private]=>
            object(DI\Definition\Source\ReflectionBasedAutowiring)#8 (0) {
            }
          }
        }
        [2]=>
        object(DI\Definition\Source\DefinitionArray)#12 (3) {
          ["definitions":"DI\Definition\Source\DefinitionArray":private]=>
          array(1) {
            ["globalset"]=>
            array(2) {
              ["logger"]=>
              array(3) {
                ["name"]=>
                string(15) "Login-Interface"
                ["path"]=>
                string(59) "D:\Working Space\clientsystem\src\Loader/../../logs/app.log"
                ["level"]=>
                int(100)
              }
              ["renderer"]=>
              array(1) {
                ["template_path"]=>
                string(57) "D:\Working Space\clientsystem\src\Loader/../../templates/"
              }
            }
          }
          ["wildcardDefinitions":"DI\Definition\Source\DefinitionArray":private]=>
          array(0) {
          }
          ["normalizer":"DI\Definition\Source\DefinitionArray":private]=>
          object(DI\Definition\Source\DefinitionNormalizer)#13 (1) {
            ["autowiring":"DI\Definition\Source\DefinitionNormalizer":private]=>
            object(DI\Definition\Source\ReflectionBasedAutowiring)#8 (0) {
            }
          }
        }
        [3]=>
        object(DI\Definition\Source\DefinitionArray)#14 (3) {
          ["definitions":"DI\Definition\Source\DefinitionArray":private]=>
          array(1) {
            ["settings"]=>
            array(2) {
              ["displayErrorDetails"]=>
              bool(true)
              ["database"]=>
              array(8) {
                ["driver"]=>
                string(5) "mysql"
                ["host"]=>
                string(9) "localhost"
                ["database"]=>
                string(7) "clients"
                ["username"]=>
                string(4) "root"
                ["password"]=>
                string(0) ""
                ["charset"]=>
                string(4) "utf8"
                ["collation"]=>
                string(15) "utf8_unicode_ci"
                ["prefix"]=>
                string(0) ""
              }
            }
          }
          ["wildcardDefinitions":"DI\Definition\Source\DefinitionArray":private]=>
          array(0) {
          }
          ["normalizer":"DI\Definition\Source\DefinitionArray":private]=>
          object(DI\Definition\Source\DefinitionNormalizer)#15 (1) {
            ["autowiring":"DI\Definition\Source\DefinitionNormalizer":private]=>
            object(DI\Definition\Source\ReflectionBasedAutowiring)#8 (0) {
            }
          }
        }
        [4]=>
        object(DI\Definition\Source\ReflectionBasedAutowiring)#8 (0) {
        }
      }
      ["rootSource":"DI\Definition\Source\SourceChain":private]=>
      *RECURSION*
      ["mutableSource":"DI\Definition\Source\SourceChain":private]=>
      object(DI\Definition\Source\DefinitionArray)#16 (3) {
        ["definitions":"DI\Definition\Source\DefinitionArray":private]=>
        array(0) {
        }
        ["wildcardDefinitions":"DI\Definition\Source\DefinitionArray":private]=>
        array(0) {
        }
        ["normalizer":"DI\Definition\Source\DefinitionArray":private]=>
        object(DI\Definition\Source\DefinitionNormalizer)#17 (1) {
          ["autowiring":"DI\Definition\Source\DefinitionNormalizer":private]=>
          object(DI\Definition\Source\ReflectionBasedAutowiring)#8 (0) {
          }
        }
      }
    }
    ["definitionResolver":"DI\Container":private]=>
    object(DI\Definition\Resolver\ResolverDispatcher)#20 (8) {
      ["container":"DI\Definition\Resolver\ResolverDispatcher":private]=>
      *RECURSION*
      ["proxyFactory":"DI\Definition\Resolver\ResolverDispatcher":private]=>
      object(DI\Proxy\ProxyFactory)#18 (3) {
        ["writeProxiesToFile":"DI\Proxy\ProxyFactory":private]=>
        bool(false)
        ["proxyDirectory":"DI\Proxy\ProxyFactory":private]=>
        NULL
        ["proxyManager":"DI\Proxy\ProxyFactory":private]=>
        NULL
      }
      ["arrayResolver":"DI\Definition\Resolver\ResolverDispatcher":private]=>
      NULL
      ["factoryResolver":"DI\Definition\Resolver\ResolverDispatcher":private]=>
      NULL
      ["decoratorResolver":"DI\Definition\Resolver\ResolverDispatcher":private]=>
      NULL
      ["objectResolver":"DI\Definition\Resolver\ResolverDispatcher":private]=>
      object(DI\Definition\Resolver\ObjectCreator)#58 (3) {
        ["proxyFactory":"DI\Definition\Resolver\ObjectCreator":private]=>
        object(DI\Proxy\ProxyFactory)#18 (3) {
          ["writeProxiesToFile":"DI\Proxy\ProxyFactory":private]=>
          bool(false)
          ["proxyDirectory":"DI\Proxy\ProxyFactory":private]=>
          NULL
          ["proxyManager":"DI\Proxy\ProxyFactory":private]=>
          NULL
        }
        ["parameterResolver":"DI\Definition\Resolver\ObjectCreator":private]=>
        object(DI\Definition\Resolver\ParameterResolver)#65 (1) {
          ["definitionResolver":"DI\Definition\Resolver\ParameterResolver":private]=>
          *RECURSION*
        }
        ["definitionResolver":"DI\Definition\Resolver\ObjectCreator":private]=>
        *RECURSION*
      }
      ["instanceResolver":"DI\Definition\Resolver\ResolverDispatcher":private]=>
      NULL
      ["envVariableResolver":"DI\Definition\Resolver\ResolverDispatcher":private]=>
      NULL
    }
    ["fetchedDefinitions":"DI\Container":private]=>
    array(1) {
      ["Slim\Error\Renderers\PlainTextErrorRenderer"]=>
      object(DI\Definition\ObjectDefinition)#41 (8) {
        ["name":"DI\Definition\ObjectDefinition":private]=>
        string(43) "Slim\Error\Renderers\PlainTextErrorRenderer"
        ["className":protected]=>
        NULL
        ["constructorInjection":protected]=>
        NULL
        ["propertyInjections":protected]=>
        array(0) {
        }
        ["methodInjections":protected]=>
        array(0) {
        }
        ["lazy":protected]=>
        NULL
        ["classExists":"DI\Definition\ObjectDefinition":private]=>
        bool(true)
        ["isInstantiable":"DI\Definition\ObjectDefinition":private]=>
        bool(true)
      }
    }
    ["entriesBeingResolved":protected]=>
    array(0) {
    }
    ["invoker":"DI\Container":private]=>
    NULL
    ["delegateContainer":protected]=>
    *RECURSION*
    ["proxyFactory":protected]=>
    object(DI\Proxy\ProxyFactory)#18 (3) {
      ["writeProxiesToFile":"DI\Proxy\ProxyFactory":private]=>
      bool(false)
      ["proxyDirectory":"DI\Proxy\ProxyFactory":private]=>
      NULL
      ["proxyManager":"DI\Proxy\ProxyFactory":private]=>
      NULL
    }
  }
}

Maybe someone could help me figure this out, Thank you.

l0gicgate commented 4 years ago

Where are you adding the LoggerInterface::class definition on your container?

Are you using Slim Skeleton?

If so it should already be defined: https://github.com/slimphp/Slim-Skeleton/blob/master/app/dependencies.php

If not, you must add the definition to your container.