psalm/plugin-symfony

Symfony 的 Psalm 插件

安装次数: 9,866,585

依赖: 195

建议者: 2

安全性: 0

星星: 226

关注者: 10

分支: 53

开放性问题: 33

语言: Gherkin

类型: psalm-plugin

v5.2.5 2024-07-03 11:57 UTC

README

Integrate

安装

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 存储库类。
  • 修复 PossiblyInvalidArgumentSymfony\Component\HttpFoundation\Request::getContent() 的问题。插件通过检查给定的参数来确定实际的返回类型,并将其标记为“字符串”或“资源”。
  • 通过检查默认值(Symfony 4.4 的第三个参数)检测 Symfony\Component\HttpFoundation\HeaderBag::get() 的返回类型。
  • 根据提供的参数检测 Symfony\Component\Messenger\Envelope::lastSymfony\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>

查看当前支持的案例。

致谢