diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlim4ServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlim4ServerCodegen.java index 9e829dc45389..d3cff59571e1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlim4ServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlim4ServerCodegen.java @@ -242,6 +242,8 @@ public void processOpts() { supportingFiles.add(new SupportingFile("htaccess_deny_all", "config", ".htaccess")); supportingFiles.add(new SupportingFile("config_dev_default.mustache", "config" + File.separator + "dev", "default.inc.php")); supportingFiles.add(new SupportingFile("config_prod_default.mustache", "config" + File.separator + "prod", "default.inc.php")); + // add restricted htaccess to create log folder + supportingFiles.add(new SupportingFile("htaccess_deny_all", "logs", ".htaccess")); if (Boolean.TRUE.equals(generateModels)) { supportingFiles.add(new SupportingFile("base_model.mustache", toSrcPath(invokerPackage, srcBasePath), "BaseModel.php")); diff --git a/modules/openapi-generator/src/main/resources/php-slim4-server/README.mustache b/modules/openapi-generator/src/main/resources/php-slim4-server/README.mustache index f49649f1cfe0..9cf862d4b16f 100644 --- a/modules/openapi-generator/src/main/resources/php-slim4-server/README.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim4-server/README.mustache @@ -131,6 +131,11 @@ Used packages: * [Openapi Data Mocker Server Middleware](https://github.com/ybelenko/openapi-data-mocker-server-middleware) - PSR-15 HTTP server middleware. * [Openapi Data Mocker Interfaces](https://github.com/ybelenko/openapi-data-mocker-interfaces) - package with mocking interfaces. +## Logging + +Build contains pre-configured [`monolog/monolog`](https://github.com/Seldaek/monolog) package. Make sure that `logs` folder is writable. +Add required log handlers/processors/formatters in `{{srcBasePath}}/App/RegisterDependencies.php`. + {{#generateApiDocs}} ## API Endpoints diff --git a/modules/openapi-generator/src/main/resources/php-slim4-server/composer.mustache b/modules/openapi-generator/src/main/resources/php-slim4-server/composer.mustache index 310edcb04f96..f6e55be7860d 100644 --- a/modules/openapi-generator/src/main/resources/php-slim4-server/composer.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim4-server/composer.mustache @@ -17,6 +17,7 @@ {{#isZendDiactoros}} "laminas/laminas-diactoros": "^2.3.0", {{/isZendDiactoros}} + "monolog/monolog": "^2.4", "neomerx/cors-psr7": "^2.0", {{#isNyholmPsr7}} "nyholm/psr7": "^1.3.0", diff --git a/modules/openapi-generator/src/main/resources/php-slim4-server/config_dev_default.mustache b/modules/openapi-generator/src/main/resources/php-slim4-server/config_dev_default.mustache index 5bdfb9f18774..8d908593ab47 100644 --- a/modules/openapi-generator/src/main/resources/php-slim4-server/config_dev_default.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim4-server/config_dev_default.mustache @@ -95,4 +95,10 @@ return [ return $response->withHeader('X-{{invokerPackage}}-Mock', 'pong'); }; }, + + // logger + 'logger.name' => 'App', + 'logger.path' => \realpath(__DIR__ . '/../../logs') . '/app.log', + 'logger.level' => 100, // equals DEBUG level + 'logger.options' => [], ]; diff --git a/modules/openapi-generator/src/main/resources/php-slim4-server/config_prod_default.mustache b/modules/openapi-generator/src/main/resources/php-slim4-server/config_prod_default.mustache index ecbf7ab8987f..31695e49a052 100644 --- a/modules/openapi-generator/src/main/resources/php-slim4-server/config_prod_default.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim4-server/config_prod_default.mustache @@ -62,4 +62,10 @@ return [ 'pdo.options' => [ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, ], + + // logger + 'logger.name' => 'App', + 'logger.path' => \realpath(__DIR__ . '/../../logs') . '/app.log', + 'logger.level' => 300, // equals WARNING level + 'logger.options' => [], ]; diff --git a/modules/openapi-generator/src/main/resources/php-slim4-server/gitignore b/modules/openapi-generator/src/main/resources/php-slim4-server/gitignore index 27433d90949e..931a98c71bd1 100644 --- a/modules/openapi-generator/src/main/resources/php-slim4-server/gitignore +++ b/modules/openapi-generator/src/main/resources/php-slim4-server/gitignore @@ -22,3 +22,7 @@ composer.phar !/config/.htaccess !/config/dev/default.inc.php !/config/prod/default.inc.php + +# Logs folder +/logs/**/*.* +!/logs/.htaccess diff --git a/modules/openapi-generator/src/main/resources/php-slim4-server/phpcs.xml.mustache b/modules/openapi-generator/src/main/resources/php-slim4-server/phpcs.xml.mustache index 024e5f3371f2..44ae4b6552b1 100644 --- a/modules/openapi-generator/src/main/resources/php-slim4-server/phpcs.xml.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim4-server/phpcs.xml.mustache @@ -8,6 +8,9 @@ ./vendor + + ./logs + diff --git a/modules/openapi-generator/src/main/resources/php-slim4-server/register_dependencies.mustache b/modules/openapi-generator/src/main/resources/php-slim4-server/register_dependencies.mustache index 732325d09e00..b1a9d3fa7dcd 100644 --- a/modules/openapi-generator/src/main/resources/php-slim4-server/register_dependencies.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim4-server/register_dependencies.mustache @@ -41,9 +41,10 @@ final class RegisterDependencies // Slim error middleware // @see https://www.slimframework.com/docs/v4/middleware/error-handling.html \Slim\Middleware\ErrorMiddleware::class => \DI\autowire() - ->constructorParameter('displayErrorDetails', \DI\get('slim.displayErrorDetails', false)) - ->constructorParameter('logErrors', \DI\get('slim.logErrors', true)) - ->constructorParameter('logErrorDetails', \DI\get('slim.logErrorDetails', true)), + ->constructorParameter('displayErrorDetails', \DI\get('slim.displayErrorDetails')) + ->constructorParameter('logErrors', \DI\get('slim.logErrors')) + ->constructorParameter('logErrorDetails', \DI\get('slim.logErrorDetails')) + ->constructorParameter('logger', \DI\get(\Psr\Log\LoggerInterface::class)), // CORS \Neomerx\Cors\Contracts\AnalysisStrategyInterface::class => \DI\create(\Neomerx\Cors\Strategies\Settings::class) @@ -57,7 +58,7 @@ final class RegisterDependencies \DI\get('pdo.dsn'), \DI\get('pdo.username'), \DI\get('pdo.password'), - \DI\get('pdo.options', null) + \DI\get('pdo.options') ), // DataMocker @@ -68,6 +69,33 @@ final class RegisterDependencies \OpenAPIServer\Mock\OpenApiDataMockerRouteMiddlewareFactory::class => \DI\autowire() ->constructorParameter('getMockStatusCodeCallback', \DI\get('mocker.getMockStatusCodeCallback')) ->constructorParameter('afterCallback', \DI\get('mocker.afterCallback')), + + // Monolog Logger + \Psr\Log\LoggerInterface::class => \DI\factory(function (string $mode, string $name, string $path, $level, array $options = []) { + $logger = new \Monolog\Logger($name); + + $handlers = []; + // stream logger as default handler across all environments + // somebody might not need it during development + $handlers[] = new \Monolog\Handler\StreamHandler($path, $level); + + if ($mode === 'development') { + // add dev handlers if necessary + // @see https://github.com/Seldaek/monolog/blob/f2f66cd480df5f165391ff9b6332700d467b25ac/doc/02-handlers-formatters-processors.md#logging-in-development + } elseif ($mode === 'production') { + // add prod handlers + // @see https://github.com/Seldaek/monolog/blob/f2f66cd480df5f165391ff9b6332700d467b25ac/doc/02-handlers-formatters-processors.md#send-alerts-and-emails + // handlers which doesn't make sense during development + // Slack, Sentry, Swift or native mailer + } + + return $logger->setHandlers($handlers); + }) + ->parameter('mode', \DI\get('mode')) + ->parameter('name', \DI\get('logger.name')) + ->parameter('path', \DI\get('logger.path')) + ->parameter('level', \DI\get('logger.level')) + ->parameter('options', \DI\get('logger.options')), ]); } } diff --git a/samples/server/petstore/php-slim4/.gitignore b/samples/server/petstore/php-slim4/.gitignore index 27433d90949e..931a98c71bd1 100644 --- a/samples/server/petstore/php-slim4/.gitignore +++ b/samples/server/petstore/php-slim4/.gitignore @@ -22,3 +22,7 @@ composer.phar !/config/.htaccess !/config/dev/default.inc.php !/config/prod/default.inc.php + +# Logs folder +/logs/**/*.* +!/logs/.htaccess diff --git a/samples/server/petstore/php-slim4/.openapi-generator/FILES b/samples/server/petstore/php-slim4/.openapi-generator/FILES index 6321cda0b3bc..5f8d12abcd2f 100644 --- a/samples/server/petstore/php-slim4/.openapi-generator/FILES +++ b/samples/server/petstore/php-slim4/.openapi-generator/FILES @@ -20,6 +20,7 @@ lib/Model/Order.php lib/Model/Pet.php lib/Model/Tag.php lib/Model/User.php +logs/.htaccess phpcs.xml.dist phpunit.xml.dist public/.htaccess diff --git a/samples/server/petstore/php-slim4/README.md b/samples/server/petstore/php-slim4/README.md index dc91b2bcbebd..14051a230467 100644 --- a/samples/server/petstore/php-slim4/README.md +++ b/samples/server/petstore/php-slim4/README.md @@ -114,6 +114,11 @@ Used packages: * [Openapi Data Mocker Server Middleware](https://github.com/ybelenko/openapi-data-mocker-server-middleware) - PSR-15 HTTP server middleware. * [Openapi Data Mocker Interfaces](https://github.com/ybelenko/openapi-data-mocker-interfaces) - package with mocking interfaces. +## Logging + +Build contains pre-configured [`monolog/monolog`](https://github.com/Seldaek/monolog) package. Make sure that `logs` folder is writable. +Add required log handlers/processors/formatters in `lib/App/RegisterDependencies.php`. + ## API Endpoints All URIs are relative to *http://petstore.swagger.io/v2* diff --git a/samples/server/petstore/php-slim4/composer.json b/samples/server/petstore/php-slim4/composer.json index afb802fcc6bf..232da8a95cfd 100644 --- a/samples/server/petstore/php-slim4/composer.json +++ b/samples/server/petstore/php-slim4/composer.json @@ -10,6 +10,7 @@ "require": { "php": "^7.4 || ^8.0", "dyorg/slim-token-authentication": "dev-slim4", + "monolog/monolog": "^2.4", "neomerx/cors-psr7": "^2.0", "php-di/slim-bridge": "^3.2", "slim/psr7": "^1.1.0", diff --git a/samples/server/petstore/php-slim4/config/dev/default.inc.php b/samples/server/petstore/php-slim4/config/dev/default.inc.php index b30088b9fca2..acc8964f67c0 100644 --- a/samples/server/petstore/php-slim4/config/dev/default.inc.php +++ b/samples/server/petstore/php-slim4/config/dev/default.inc.php @@ -95,4 +95,10 @@ return $response->withHeader('X-OpenAPIServer-Mock', 'pong'); }; }, + + // logger + 'logger.name' => 'App', + 'logger.path' => \realpath(__DIR__ . '/../../logs') . '/app.log', + 'logger.level' => 100, // equals DEBUG level + 'logger.options' => [], ]; diff --git a/samples/server/petstore/php-slim4/config/prod/default.inc.php b/samples/server/petstore/php-slim4/config/prod/default.inc.php index 842df79d810a..2d7cc16d3865 100644 --- a/samples/server/petstore/php-slim4/config/prod/default.inc.php +++ b/samples/server/petstore/php-slim4/config/prod/default.inc.php @@ -62,4 +62,10 @@ 'pdo.options' => [ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, ], + + // logger + 'logger.name' => 'App', + 'logger.path' => \realpath(__DIR__ . '/../../logs') . '/app.log', + 'logger.level' => 300, // equals WARNING level + 'logger.options' => [], ]; diff --git a/samples/server/petstore/php-slim4/lib/App/RegisterDependencies.php b/samples/server/petstore/php-slim4/lib/App/RegisterDependencies.php index 137d2671a385..83b8452fad8b 100644 --- a/samples/server/petstore/php-slim4/lib/App/RegisterDependencies.php +++ b/samples/server/petstore/php-slim4/lib/App/RegisterDependencies.php @@ -54,9 +54,10 @@ public function __invoke(\DI\ContainerBuilder $containerBuilder): void // Slim error middleware // @see https://www.slimframework.com/docs/v4/middleware/error-handling.html \Slim\Middleware\ErrorMiddleware::class => \DI\autowire() - ->constructorParameter('displayErrorDetails', \DI\get('slim.displayErrorDetails', false)) - ->constructorParameter('logErrors', \DI\get('slim.logErrors', true)) - ->constructorParameter('logErrorDetails', \DI\get('slim.logErrorDetails', true)), + ->constructorParameter('displayErrorDetails', \DI\get('slim.displayErrorDetails')) + ->constructorParameter('logErrors', \DI\get('slim.logErrors')) + ->constructorParameter('logErrorDetails', \DI\get('slim.logErrorDetails')) + ->constructorParameter('logger', \DI\get(\Psr\Log\LoggerInterface::class)), // CORS \Neomerx\Cors\Contracts\AnalysisStrategyInterface::class => \DI\create(\Neomerx\Cors\Strategies\Settings::class) @@ -70,7 +71,7 @@ public function __invoke(\DI\ContainerBuilder $containerBuilder): void \DI\get('pdo.dsn'), \DI\get('pdo.username'), \DI\get('pdo.password'), - \DI\get('pdo.options', null) + \DI\get('pdo.options') ), // DataMocker @@ -81,6 +82,33 @@ public function __invoke(\DI\ContainerBuilder $containerBuilder): void \OpenAPIServer\Mock\OpenApiDataMockerRouteMiddlewareFactory::class => \DI\autowire() ->constructorParameter('getMockStatusCodeCallback', \DI\get('mocker.getMockStatusCodeCallback')) ->constructorParameter('afterCallback', \DI\get('mocker.afterCallback')), + + // Monolog Logger + \Psr\Log\LoggerInterface::class => \DI\factory(function (string $mode, string $name, string $path, $level, array $options = []) { + $logger = new \Monolog\Logger($name); + + $handlers = []; + // stream logger as default handler across all environments + // somebody might not need it during development + $handlers[] = new \Monolog\Handler\StreamHandler($path, $level); + + if ($mode === 'development') { + // add dev handlers if necessary + // @see https://github.com/Seldaek/monolog/blob/f2f66cd480df5f165391ff9b6332700d467b25ac/doc/02-handlers-formatters-processors.md#logging-in-development + } elseif ($mode === 'production') { + // add prod handlers + // @see https://github.com/Seldaek/monolog/blob/f2f66cd480df5f165391ff9b6332700d467b25ac/doc/02-handlers-formatters-processors.md#send-alerts-and-emails + // handlers which doesn't make sense during development + // Slack, Sentry, Swift or native mailer + } + + return $logger->setHandlers($handlers); + }) + ->parameter('mode', \DI\get('mode')) + ->parameter('name', \DI\get('logger.name')) + ->parameter('path', \DI\get('logger.path')) + ->parameter('level', \DI\get('logger.level')) + ->parameter('options', \DI\get('logger.options')), ]); } } diff --git a/samples/server/petstore/php-slim4/logs/.htaccess b/samples/server/petstore/php-slim4/logs/.htaccess new file mode 100644 index 000000000000..3a4288278871 --- /dev/null +++ b/samples/server/petstore/php-slim4/logs/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/samples/server/petstore/php-slim4/phpcs.xml.dist b/samples/server/petstore/php-slim4/phpcs.xml.dist index 69f4ddac71c3..f85b2de8402b 100644 --- a/samples/server/petstore/php-slim4/phpcs.xml.dist +++ b/samples/server/petstore/php-slim4/phpcs.xml.dist @@ -8,6 +8,9 @@ ./vendor + + ./logs +