psalm / plugin-symfony
Symfony 的 Psalm 插件
Requires
- php: ^8.1
- ext-simplexml: *
- symfony/framework-bundle: ^5.0 || ^6.0 || ^7.0
- vimeo/psalm: ^5.16
Requires (Dev)
- doctrine/annotations: ^1.8|^2
- doctrine/orm: ^2.9
- phpunit/phpunit: ~7.5 || ~9.5
- symfony/cache-contracts: ^1.0 || ^2.0
- symfony/console: *
- symfony/form: ^5.0 || ^6.0 || ^7.0
- symfony/messenger: ^5.0 || ^6.0 || ^7.0
- symfony/security-core: *
- symfony/serializer: ^5.0 || ^6.0 || ^7.0
- symfony/validator: *
- twig/twig: ^2.10 || ^3.0
- weirdan/codeception-psalm-module: dev-master
Suggests
- weirdan/doctrine-psalm-plugin: If Doctrine is used, it is recommended install this plugin
- dev-master
- 5.x-dev
- v5.2.5
- v5.2.4
- v5.2.3
- v5.2.2
- v5.2.1
- v5.2.0
- v5.1.0
- v5.0.5
- v5.0.4
- v5.0.3
- v5.0.2
- v5.0.1
- v5.0.0
- 4.x-dev
- v4.0.4
- v4.0.3
- v4.0.2
- v4.0.1
- v4.0.0
- 3.x-dev
- v3.1.10
- v3.1.9
- v3.1.8
- v3.1.7
- v3.1.6
- v3.1.5
- v3.1.4
- v3.1.3
- v3.1.2
- v3.1.1
- v3.1.0
- v3.0.4
- v3.0.3
- v3.0.2
- v3.0.1
- v3.0.0
- v2.x-dev
- v2.5.1
- v2.5.0
- v2.4.0
- v2.3.1
- v2.3.0
- v2.2.4
- v2.2.3
- v2.2.2
- v2.2.1
- v2.2.0
- v2.1.2
- v2.1.1
- v2.1.0
- v2.0.4
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- v1.5.0
- v1.4.5
- v1.4.4
- v1.4.3
- v1.4.2
- v1.4.1
- v1.4.0
- v1.3.0
- v1.2.3
- v1.2.2
- v1.2.1
- v1.2.0
- v1.1.3
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.0
- dev-1x
This package is auto-updated.
Last update: 2024-09-03 12:20:39 UTC
README
安装
composer require --dev psalm/plugin-symfony
vendor/bin/psalm --init
vendor/bin/psalm-plugin enable psalm/plugin-symfony
版本和依赖
功能
- 检测
ContainerInterface::get()
的结果类型。如果您配置了编译后的容器 XML 文件,则效果更好。 - 检测来自
ContainerInterface::getParameter()
的参数返回类型。 - 支持 服务订阅者。只有配置了编译后的容器 XML 文件才能工作。
- 检测控制台参数(
InputInterface::getArgument()
)和选项(InputInterface::getOption()
)的返回类型。强制使用“InputArgument”和“InputOption”常量作为最佳实践。 - 当通过注解配置时,检测与实体关联的 Doctrine 存储库类。
- 修复
PossiblyInvalidArgument
对Symfony\Component\HttpFoundation\Request::getContent()
的问题。插件通过检查给定的参数来确定实际的返回类型,并将其标记为“字符串”或“资源”。 - 通过检查默认值(Symfony 4.4 的第三个参数)检测
Symfony\Component\HttpFoundation\HeaderBag::get()
的返回类型。 - 根据提供的参数检测
Symfony\Component\Messenger\Envelope::last
和Symfony\Component\Messenger\Envelope::all
的返回类型。 - Symfony 的污染分析。
- 检测服务的命名约定违规。
- 当
Container
注入到服务中时,会提出警告,并建议使用依赖注入。 - 修复
PropertyNotSetInConstructor
假阳性问题- AbstractController 中的 $container
- ConstraintValidator 类中的 $context
- 自定义
@Annotation
类中的属性
- 还有更多!查看更多
配置
如果您遵循安装说明,psalm-plugin 命令将此插件配置添加到 psalm.xml
配置文件。
<?xml version="1.0"?> <psalm errorLevel="1"> <!-- project configuration --> <plugins> <pluginClass class="Psalm\SymfonyPsalmPlugin\Plugin" /> </plugins> </psalm>
为了能够检测使用 ID 的服务的返回类型(通常在 Symfony YAML 配置文件中以 @
开头。例如:logger
服务),必须提供 containerXml
。示例
<pluginClass class="Psalm\SymfonyPsalmPlugin\Plugin"> <containerXml>var/cache/dev/App_KernelDevDebugContainer.xml</containerXml> </pluginClass>
此文件路径可能会根据您的 Symfony 版本、文件结构和环境设置而变化。默认文件是
- Symfony 3:
var/cache/dev/srcDevDebugProjectContainer.xml
- Symfony 4:
var/cache/dev/srcApp_KernelDevDebugContainer.xml
- Symfony 5+:
var/cache/dev/App_KernelDevDebugContainer.xml
可以配置多个容器文件。在这种情况下,将考虑第一个有效的文件。如果给定的文件中没有有效的文件,则抛出配置异常。示例
<pluginClass class="Psalm\SymfonyPsalmPlugin\Plugin"> <containerXml>var/cache/dev/App_KernelDevDebugContainer.xml</containerXml> <containerXml>var/cache/dev/App_KernelTestDebugContainer.xml</containerXml> </pluginClass>
如果您正在使用 PHP 配置文件为 Symfony 5.3+,则需要此文件用于自动加载 Symfony\Config
<extraFiles> <directory name="var/cache/dev/Symfony/Config" /> <!-- https://github.com/psalm/psalm-plugin-symfony/issues/201 --> </extraFiles>
如果您正在您的 PHP 配置文件中使用 Symfony 的 env()
或 param()
函数,则需要此文件用于自动加载它们
<stubs> <file name="vendor/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php" /> </stubs>
如果您遇到以下错误
MissingFile - config/preload.php - 无法找到文件 ...var/cache/prod/App_KernelProdContainer.preload.php 以包含
...您可以通过这种方式忽略它
<issueHandlers> <MissingFile> <!-- https://github.com/psalm/psalm-plugin-symfony/issues/205 --> <errorLevel type="suppress"> <file name="config/preload.php" /> </errorLevel> </MissingFile> </issueHandlers>
Symfony 版本
默认情况下,该插件使用 Kernel::MAJOR_VERSION
常量来确定您的 Symfony 版本。但是,如果您全局安装了 Psalm,这可能不准确。您可以使用 symfonyMajorVersion
配置选项显式设置版本。
<pluginClass class="Psalm\SymfonyPsalmPlugin\Plugin"> <symfonyMajorVersion>6</symfonyMajorVersion> </pluginClass>
Twig 污染(实验性)
在Twig模板的污染分析方面,目前有两种方法。
- 第一种方法基于特定的文件分析器(
Psalm\SymfonyPsalmPlugin\Twig\TemplateFileAnalyzer
),它利用Twig解析器和访问AST节点。 - 第二种方法基于已编译的Twig模板,它仅将
Twig\Environment::render
的调用桥接到编译模板的实际doRender
方法。
Twig 分析器
这种方法更稳健,因为它依赖于官方的Twig解析器和节点访问机制。目前,它只能检测简单的污染路径。
要利用真正的Twig文件分析器,您必须配置一个针对 .twig
扩展的检查器,如下所示。
<fileExtensions> <extension name=".php" /> <extension name=".twig" checker="/vendor/psalm/plugin-symfony/src/Twig/TemplateFileAnalyzer.php"/> </fileExtensions>
缓存分析器
这种方法“更脏”,因为它试图将应用程序代码中的污染连接到表示特定模板的编译PHP代码。理论上,它能够比前一种方法更轻松地检测到更多污染,但它仍然缺乏处理继承等问题的方法。
要允许通过缓存模板文件进行分析,您必须将 twigCachePath
条目添加到插件配置中。
<pluginClass class="Psalm\SymfonyPsalmPlugin\Plugin"> <twigCachePath>/cache/twig</twigCachePath> </pluginClass>
致谢
- 插件由 @seferov 创建
- @weirdan 为 codeception psalm 模块 贡献