sfp-phpstan-psr-log
sfp-phpstan-psr-log copied to clipboard
Extra strict and opinionated psr/log (psr-3) rules for PHPStan
psr/log(PSR-3) extensions for PHPStan
struggle-for-php/sfp-phpstan-psr-log is extra strict and opinionated psr/log (psr-3) rules for PHPStan.
[!IMPORTANT] Since
0.20.0, changed default rule settings.
- MessageStaticStringRule is enabled by default.
- ContextRequireExceptionKeyRule is disabled by default.
- [Recommendation] write these parameters to your project's
phpstan.neon.
parameters:
sfpPsrLog:
enableMessageStaticStringRule: true
enableContextRequireExceptionKeyRule: true
reportContextExceptionLogLevel: 'info'
contextKeyOriginalPattern: '#\A[A-Za-z0-9-_]+\z#'
Stubs
This extension depends on our psr/log stub to serve strictness.
- eg.
@param LogLevel::* $levelatlog()method@param array{exception?: \Throwable} $context
See psr/log stub repository page to get more detail.
Rules
This package provides the following rules.
PlaceholderCharactersRule
Placeholder names SHOULD be composed only of the characters A-Z, a-z, 0-9, underscore _, and period .
| :pushpin: error identifier |
|---|
| sfp-psr-log.placeholderCharactersInvalidChar |
- reports when placeholder in
$messagecharacters are not,A-Z,a-z,0-9, underscore_, and period.
// bad
$logger->info('message are {foo-hyphen}');
| :pushpin: error identifier |
|---|
| sfp-psr-log.placeholderCharactersDoubleBraces |
- reports when double braces pair
{{}}are used.
// bad
$logger->info('message are {{foo}}');
PlaceholderCorrespondToKeysRule
Placeholder names MUST correspond to keys in the context array.
| :pushpin: error identifier |
|---|
| sfp-psr-log.placeholderCorrespondToKeysMissedContext |
- reports when placeholder exists in message, but
$contextparameter is missed.
// bad
$logger->info('message has {nonContext} .');
| :pushpin: error identifier |
|---|
| sfp-psr-log.placeholderCorrespondToKeysMissedKey |
- reports when placeholder exists in message, but key in
$contextdoes not exist against them.
// bad
$logger->info('user {user_id} gets an error {error} .', ['user_id' => $user_id]);
ContextKeyRule
[!NOTE] PSR-3 has no provisions for array keys, but this is useful in many cases.
| :pushpin: error identifier |
|---|
| sfp-psr-log.contextKeyNonEmptyString |
- reports when context key is not non-empty-string.
// bad
[123 => 'foo']`, `['' => 'bar']`, `['baz']
| :pushpin: error identifier |
|---|
| sfp-psr-log.contextKeyOriginalPattern |
- reports when context key is not matched you defined pattern.
- if
contextKeyOriginalPatternparameter is not set, this check would be ignored.
- if
Configuration
- You can set specific key pattern by regex.(
preg_match())
parameters:
sfpPsrLog:
contextKeyOriginalPattern: '#\A[A-Za-z0-9-]+\z#'
ContextRequireExceptionKeyRule
[!NOTE] This is not a rule for along with PSR-3 specification, but provides best practices.
| :pushpin: error identifier |
|---|
| sfp-psr-log.contextRequireExceptionKey |
- It forces
exceptionkey into context parameter when current scope has\Throwableobject.
Example
<?php
/** @var \Psr\Log\LoggerInterface $logger */
try {
//
} catch (LogicException $exception) {
$logger->warning("foo");
}
$ ../vendor/bin/phpstan analyse
Note: Using configuration file /tmp/your-project/phpstan.neon.
2/2 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
------ -------------------------------------------------------------
Line Demo.php
------ -------------------------------------------------------------
6 Parameter $context of logger method Psr\Log\LoggerInterface::warning() requires \'exception\' key. Current scope has Throwable variable - $exception
------ -------------------------------------------------------------
[ERROR] Found 1 error
Configuration
- You can set the minimum required level to report. (default level is
debug)
parameters:
sfpPsrLog:
reportContextExceptionLogLevel: 'warning'
Then, debug| info | notice LogLevel is ignored for report.
} catch (\Exception $e) {
$logger->info('more info'); // allow
$logger->warning($e->getMessage(), ['exception' => $e]);
}
- If you want to enable this rule, please add
enableContextRequireExceptionKeyRuleas true.
parameters:
sfpPsrLog:
enableContextRequireExceptionKeyRule: true
MessageStaticStringRule
| :pushpin: error identifier |
|---|
| sfp-psr-log.messageNotStaticString |
- reports when $message is not static string value.
// bad
$logger->info(sprintf('Message contains %s variable', $var));
Configuration
- If you want to disable this rule, please add
enableMessageStaticStringRuleas false.
parameters:
sfpPsrLog:
enableMessageStaticStringRule: false
Installation
To use this extension, require it in Composer:
composer require --dev struggle-for-php/sfp-phpstan-psr-log
If you also install phpstan/extension-installer then you're all set.
Manual installation
If you don't want to use phpstan/extension-installer, include extension.neon & rules.neon in your project's PHPStan config:
includes:
- vendor/struggle-for-php/sfp-phpstan-psr-log/extension.neon
- vendor/struggle-for-php/sfp-phpstan-psr-log/rules.neon