Description
Problem Overview
Some of the rules like strict_types
were introduced in later Magento versions and are not applicable to earlier ones. Magento Marketplace still checks the code of extensions compatible with Magento 2.0, 2.1, 2.2. How to handle version specific rules?
Solution
Provide mechanism of version specific sniffs using OOB PHP CodeSniffer functionality. By default PHP CodeSniffer will do check assuming the latest Magento version.
Implementation Details
Create new sniffs Group which will handle runtime parameter magentoVersion
and run sniff only when it meets version requirement.
For example
phpcs --runtime-set magentoVersion 2.2
Each sniff from version specific group will call doRun
method that checks versions compatibiliy.
use PHP_CodeSniffer\Config;
class VersionChecker
{
public function doRun($sniffVersion)
{
$runtimeVersion = Config::getConfigData('magentoVersion');
if ($runtimeVersion !== null) {
return version_compare($runtimeVersion, $sniffVersion, '>=');
}
return true;
}
}
Magento version specific sniff will contain code that determines whether the sniff needs to be executed.
class SomeNewlyIntroducedSniff implements Sniff
{
// Magento version where the rule was introduced.
private $introducedIn = '2.3';
private $versionChecker;
public function __construct()
{
$this->versionChecker = new VersionChecker();
}
public function process(File $phpcsFile, $stackPtr)
{
if ($this->versionChecker->doRun($this->introducedIn) === false) {
return;
}
//code goes here
}
}
Pros
- everything in one place;
- no need to maintain the whole repo versioning.
Cons
- only default behavior will work in IDE;
- need to care about legacy sniffs if specific Magento version became unsupported.