dreikern / phpstan-oxid
OXID eShop 的 PHPStan 扩展
0.1.6
2023-10-23 11:11 UTC
Requires
- php: ^7.4 || ^8.0
- phpstan/phpstan: ^1.8.0
- symfony/yaml: >=3.4
Requires (Dev)
- nikic/php-parser: ^4.13.0
- oxid-esales/oxideshop-ce: ^v6.8.0 || ^v7.0.0@rc
- php-parallel-lint/php-parallel-lint: ^1.3
- phpstan/phpstan-phpunit: ^1.0
- phpstan/phpstan-strict-rules: ^1.0
- phpunit/phpunit: ^9.5
README
本扩展提供以下功能
- OXID eShop 使用类链来将模块注入其系统中。这个类链在运行时构建,因此静态代码分析器 PHPStan 无法检测到。此扩展读取您的商店配置(例如
var/configuration/shops/1.yaml
)并在 PHPStan 分析您的代码时构建此类链。仅考虑启用的模块。这允许 PHPStan 展示其魔法。 - 当使用
oxNew()
或Registry::get()
时,此扩展在 PHPStan 分析您的代码时动态更改返回类型,使其了解您的代码对 OXID eShop 类所做的任何更改。 - 为修复 OXID eShop 中的不正确的 phpdoc 注释,此扩展提供了一些 OXID eShop 类的存根。当您遇到此类错误时,请随时贡献更多存根。PHPStan 文档
- 提供规则以检测使用旧类名(例如
oxdiscount
而不是\OxidEsales\Eshop\Application\Model\Discount
)或没有统一命名空间的类(例如\OxidEsales\EshopCommunity\Application\Model\Voucher
而不是\OxidEsales\Eshop\Application\Model\Voucher
)。
安装
要使用此扩展,请在 Composer 中要求它
composer require --dev dreikern/phpstan-oxid
如果您还安装了 phpstan/extension-installer,那么您就准备就绪了!
手动安装
如果您不想使用 phpstan/extension-installer
,请将 extension.neon 包含在您的项目 PHPStan 配置中
includes: - vendor/dreikern/phpstan-oxid/extension.neon
配置
如果您的商店模块配置路径与 var/configuration/shops/1.yaml
不同,您可以在 phpstan.neon
中覆盖此路径
parameters: oxid: shopConfigurationPath: var/configuration/shops/1.yaml
如果您需要分析不同的子商店而无需更改 phpstan.neon
,您可以通过环境变量设置路径
PHPSTAN_OXID_CONFIG_PATH=path/to/config/1.yaml ./vendor/bin/phpstan analyze path/to/oxid/module
规则
OxNewCalledWithEditionNamespaceRule
对类 %s
的 oxNew()
调用使用版本命名空间。使用 %s
代替。
oxNew(\OxidEsales\EshopCommunity\Application\Model\Voucher::class);
❌
oxNew(\OxidEsales\Eshop\Application\Model\Voucher::class);
✅
OxNewCalledWithLegacyClassNameRule
对旧类名 %s
的 oxNew()
调用。使用 %s
代替。
oxNew('oxdiscount');
❌
oxNew(\OxidEsales\Eshop\Application\Model\Discount::class);
✅
RegistryGetCalledWithEditionNamespaceRule
对类 %s
的 Registry::get()
调用使用版本命名空间。使用 %s
代替。
Registry::get(\OxidEsales\EshopCommunity\Application\Model\Voucher::class);
❌
Registry::get(\OxidEsales\Eshop\Application\Model\Discount::class);
✅
RegistryGetCalledWithLegacyClassNameRule
对旧类名 %s
的 Registry::get()
调用。使用 %s
代替。
Registry::get('oxdiscount');
❌
Registry::get(\OxidEsales\Eshop\Application\Model\Voucher::class);
✅
鸣谢
此 PHPStan 扩展深受 phpstan-doctrine 的启发