saschaegerer/phpstan-typo3

PHPStan 的 TYPO3 CMS 类反射扩展

资助包维护!
sascha-egerer
Liberapay

安装数: 1,918,084

依赖者: 245

建议者: 0

安全性: 0

星标: 42

关注者: 6

分支: 22

开放问题: 8

类型:phpstan-extension


README

PHPStan 的 TYPO3 CMS 类反射扩展和框架特定规则。

Build

此扩展提供了以下功能(!!!非详尽列表!!!)

动态返回类型扩展

  • \TYPO3\CMS\Core\Context\Context->getAspect() 提供正确的返回类型。
  • \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance() 提供正确的返回类型。
  • \TYPO3\CMS\Extbase\Object\ObjectManagerInterface->get() 提供正确的返回类型。
  • \TYPO3\CMS\Extbase\Object\ObjectManager->get() 提供正确的返回类型。
  • \TYPO3\CMS\Extbase\Property\PropertyMapper->convert() 提供正确的返回类型。
  • \TYPO3\CMS\Core\Utility\MathUtility 方法,如 isIntegerInRange,提供正确的返回类型。
  • \TYPO3\CMS\Extbase\Persistence\Generic\Query->execute() 提供正确的返回类型。
  • \TYPO3\CMS\Extbase\Persistence\QueryInterface->execute() 提供正确的返回类型。
  • \TYPO3\CMS\Core\Site\Entity\Site->getAttribute() 提供正确的返回类型。
  • \Psr\Http\Message\ServerRequestInterface->getAttribute() 提供正确的返回类型。
  • 底层使用 bnf/phpstan-psr-container

所有这些动态返回类型扩展都是必要的,以便教 PHPStan 什么类型会由特定的方法调用返回。

展示一个实际用法。例如,PHPStan 无法天生知道如果你调用 `\TYPO3\CMS\Core\Utility\MathUtility->forceIntegerInRange(1000, 1, 10)` 将返回什么类型。它将是一个 int<10>。借助这个库,PHPStan 也知道结果类型。

想象以下情况在你的代码中

use TYPO3\CMS\Core\Utility\MathUtility;

$integer = MathUtility::forceIntegerInRange(100, 1, 10);

if($integer > 10) {
    throw new \UnexpectedValueException('The integer is too big')
}

PHPStan 会告诉你 if 条件是多余的,因为变量 $integer 永远不会大于 10。对吗?

框架特定规则

  • \TYPO3\CMS\Core\Context\Context->getAspect() 提供规则。
  • \Psr\Http\Message\ServerRequestInterface->getAttribute() 提供规则。
  • \TYPO3\CMS\Core\Site\Entity\Site->getAttribute() 提供规则。
  • \TYPO3\CMS\Extbase\Validation\ValidatorResolver->createValidator() 提供规则。
展示一个实际用法。

例如,PHPStan 无法天生知道调用 ValidatorResolver->createValidator(RegularExpressionValidator::class) 是无效的,因为我们没有传递必要的选项 regularExpression。借助这个库,PHPStan 现在会抱怨我们遗漏了必要的选项。所以继续前进,在运行代码之前找到代码中的错误。

安装与配置

要使用此扩展,请在 Composer 中要求它

composer require --dev saschaegerer/phpstan-typo3

如果你还安装了 phpstan/extension-installer,那么你一切都准备好了!

手动安装

如果你不想使用 phpstan/extension-installer,请将以下内容放入你的 phpstan.neon 配置中

includes:
    - vendor/saschaegerer/phpstan-typo3/extension.neon

自定义上下文 API 方面

如果你使用自定义的 TYPO3 上下文 API 方面,可以添加映射,让 PHPStan 知道上下文 API 返回什么类型的方面类。

parameters:
    typo3:
        contextApiGetAspectMapping:
            myCustomAspect: FlowdGmbh\MyProject\Context\MyCustomAspect
// PHPStan will now know that $myCustomAspect is of type FlowdGmbh\MyProject\Context\MyCustomAspect
$myCustomAspect = GeneralUtility::makeInstance(Context::class)->getAspect('myCustomAspect');

自定义请求属性

如果你使用自定义的 PSR-7 请求属性,可以添加映射,让 PHPStan 知道 Request::getAttribute() 返回什么类型的类。

parameters:
    typo3:
        requestGetAttributeMapping:
            myAttribute: FlowdGmbh\MyProject\Http\MyAttribute
            myNullableAttribute: FlowdGmbh\MyProject\Http\MyAttribute|null
// PHPStan will now know that $myAttribute is of type FlowdGmbh\MyProject\Http\MyAttribute
$myAttribute = $request->getAttribute('myAttribute');

自定义站点属性

如果您在TYPO3 Site API中使用自定义属性,您可以添加映射,这样PHPStan就会知道由网站API返回的类型是什么。

parameters:
    typo3:
        siteGetAttributeMapping:
            myArrayAttribute: array
            myIntAttribute: int
            myStringAttribute: string
$site = $this->request->getAttribute('site');

// PHPStan will now know that $myArrayAttribute is of type array<mixed, mixed>
$myArrayAttribute = $site->getAttribute('myArrayAttribute');

// PHPStan will now know that $myIntAttribute is of type int
$myIntAttribute = $site->getAttribute('myIntAttribute');

// PHPStan will now know that $myStringAttribute is of type string
$myStringAttribute = $site->getAttribute('myStringAttribute');

检查私有服务

您必须提供App_KernelDevelopmentDebugContainer.xml或类似XML文件的路径,该文件描述了您的容器。这是由ssch/typo3-debug-dump-pass生成的,位于您的/var/cache/{TYPO3_CONTEXT}/文件夹中。

parameters:
    typo3:
        containerXmlPath: var/cache/development/App_KernelDevelopmentDebugContainer.xml