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
+