dev-master
9999999-devTYPO3 CMS class reflection extension for PHPStan
MIT
The Requires
TYPO3 CMS class reflection extension for PHPStan
TYPO3 CMS class reflection extension for PHPStan & framework-specific rules., (*1)
This extension provides the following features (!!! not an exhaustive list !!!):, (*3)
Dynamic Return Type Extensions
* Provides correct return type for \TYPO3\CMS\Core\Context\Context->getAspect()
.
* Provides correct return type for \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance()
.
* Provides correct return type for \TYPO3\CMS\Extbase\Object\ObjectManagerInterface->get()
.
* Provides correct return type for \TYPO3\CMS\Extbase\Object\ObjectManager->get()
.
* Provides correct return type for \TYPO3\CMS\Extbase\Property\PropertyMapper->convert()
.
* Provides correct return type for \TYPO3\CMS\Core\Utility\MathUtility
methods like isIntegerInRange.
* Provides correct return type for \TYPO3\CMS\Extbase\Persistence\Generic\Query->execute()
.
* Provides correct return type for \TYPO3\CMS\Extbase\Persistence\QueryInterface->execute()
.
* Provides correct return type for \TYPO3\CMS\Core\Site\Entity\Site->getAttribute()
.
* Provides correct return type for \Psr\Http\Message\ServerRequestInterface->getAttribute()
.
* Uses under the hood bnf/phpstan-psr-container, (*4)
All these dynamic return type extensions are necessary to teach PHPStan what type will be returned by the specific method call., (*5)
Show me a practical use case.
For example PHPStan cannot know innately what type will be returned if you call \TYPO3\CMS\Core\Utility\MathUtility->forceIntegerInRange(1000, 1, 10)
.
It will be an int. With the help of this library PHPStan also knows whatÂŽs going up.
Imagine the following situation in your code:, (*7)
use TYPO3\CMS\Core\Utility\MathUtility; $integer = MathUtility::forceIntegerInRange(100, 1, 10); if($integer > 10) { throw new \UnexpectedValueException('The integer is too big') }
PHPStan will tell you that the if condition is superfluous, because the variable $integer will never be higher than 10. Right? , (*8)
Framework specific rules
* Provides rule for \TYPO3\CMS\Core\Context\Context->getAspect()
.
* Provides rule for \Psr\Http\Message\ServerRequestInterface->getAttribute()
.
* Provides rule for \TYPO3\CMS\Core\Site\Entity\Site->getAttribute()
.
* Provides rule for \TYPO3\CMS\Extbase\Validation\ValidatorResolver->createValidator()
., (*9)
Show me a practical use case.
For example PHPStan cannot know innately that calling ValidatorResolver->createValidator(RegularExpressionValidator::class)
is invalid, because we miss to pass the required option regularExpression
.
With the help of this library PHPStan now complaints that we have missed to pass the required option.
So go ahead and find bugs in your code without running it., (*11)
, (*12)
To use this extension, require it in Composer:, (*13)
composer require --dev saschaegerer/phpstan-typo3
If you also install phpstan/extension-installer then you're all set!, (*14)
Manual installation
If you don't want to use phpstan/extension-installer
, put this into your phpstan.neon config:, (*16)
includes: - vendor/saschaegerer/phpstan-typo3/extension.neon
, (*17)
If you use custom aspects for the TYPO3 Context API you can add a mapping so PHPStan knows what type of aspect class is returned by the context API, (*18)
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');
If you use custom PSR-7 request attribute you can add a mapping so PHPStan knows what type of class is returned by Request::getAttribute(), (*19)
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');
If you use custom attributes for the TYPO3 Site API you can add a mapping so PHPStan knows what type is returned by the site API, (*20)
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');
You have to provide a path to App_KernelDevelopmentDebugContainer.xml or similar XML file describing your container. This is generated by ssch/typo3-debug-dump-pass in your /var/cache/{TYPO3_CONTEXT}/ folder., (*21)
parameters: typo3: containerXmlPath: var/cache/development/App_KernelDevelopmentDebugContainer.xml
TYPO3 CMS class reflection extension for PHPStan
MIT