phpstan/phpstan-symfony

Symfony 框架扩展和 PHPStan 规则

安装数: 41,626,600

依赖者: 944

建议者: 2

安全: 0

星标: 698

关注者: 10

分支: 89

开放问题: 59

类型:phpstan-extension

1.4.9 2024-09-05 16:15 UTC

README

Build Latest Stable Version License

此扩展提供以下功能

  • ContainerInterface::get()::has() 方法提供正确的返回类型。
  • Controller::get()::has() 方法提供正确的返回类型。
  • AbstractController::get()::has() 方法提供正确的返回类型。
  • ContainerInterface::getParameter()::hasParameter() 方法提供正确的返回类型。
  • ParameterBagInterface::get()::has() 方法提供正确的返回类型。
  • Controller::getParameter() 方法提供正确的返回类型。
  • AbstractController::getParameter() 方法提供正确的返回类型。
  • 基于 $asResource 参数为 Request::getContent() 方法提供正确的返回类型。
  • 基于 $first 参数为 HeaderBag::get() 方法提供正确的返回类型。
  • 基于 $stampFqcn 参数为 Envelope::all() 方法提供正确的返回类型。
  • 基于 $default 参数为 InputBag::get() 方法提供正确的返回类型。
  • 基于 $key 参数为 InputBag::all() 方法提供正确的返回类型。
  • TreeBuilderNodeDefinition 对象提供正确的返回类型。
  • 当你尝试从容器中获取未注册的服务时,会通知你。
  • 当你尝试从容器中获取私有服务时,会通知你。
  • 可选地纠正 InputInterface::getArgument()::getOption::hasArgument::hasOption 的返回类型。

安装

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

composer require --dev phpstan/phpstan-symfony

如果你还安装了 phpstan/extension-installer,那么你就可以开始了!

手动安装

如果你不想使用 phpstan/extension-installer,请将 extension.neon 包含在你的项目的 PHPStan 配置中

includes:
    - vendor/phpstan/phpstan-symfony/extension.neon

为了执行框架特定的检查,请还包含此文件

includes:
    - vendor/phpstan/phpstan-symfony/rules.neon

配置

你必须提供一个指向 srcDevDebugProjectContainer.xml 或类似 XML 文件(描述你的容器)的路径。

parameters:
    symfony:
        containerXmlPath: var/cache/dev/srcDevDebugProjectContainer.xml
        # or with Symfony 4.2+
        containerXmlPath: var/cache/dev/srcApp_KernelDevDebugContainer.xml
        # or with Symfony 5+
        containerXmlPath: var/cache/dev/App_KernelDevDebugContainer.xml
    # If you're using PHP config files for Symfony 5.3+, you also need this for auto-loading of `Symfony\Config`:
    scanDirectories:
        - var/cache/dev/Symfony/Config
    # If you're using PHP config files (including the ones under packages/*.php) for Symfony 5.3+,
    # you need this to load the helper functions (i.e. service(), env()):
    scanFiles:
        - vendor/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php

常量 hassers

有时,当你处理可选依赖项时,::has() 方法可能会引起问题。例如,以下结构会抱怨条件总是要么开启要么关闭,这取决于你是否安装了 service 依赖项。

if ($this->has('service')) {
    // ...
}

在这种情况下,你可以像这样禁用 ::has() 方法返回类型解析

parameters:
	symfony:
		constantHassers: false

请注意,这可能会隐藏应用程序中的真正错误。

Symfony 命令行分析

通过提供您的应用程序的命令行应用程序,您可以选择更深入地分析 Symfony 命令行命令。这将允许在访问 $input->getArgument()$input->getOption() 时推断正确的参数和选项类型。

parameters:
	symfony:
		consoleApplicationLoader: tests/console-application.php

Symfony 4

// tests/console-application.php

use App\Kernel;
use Symfony\Bundle\FrameworkBundle\Console\Application;

require __DIR__ . '/../config/bootstrap.php';
$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
return new Application($kernel);

Symfony 5

// tests/console-application.php

use App\Kernel;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Dotenv\Dotenv;

require __DIR__ . '/../vendor/autoload.php';

(new Dotenv())->bootEnv(__DIR__ . '/../.env');

$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
return new Application($kernel);

单个命令应用程序:

// tests/console-application.php

use App\Application; // where Application extends Symfony\Component\Console\SingleCommandApplication
use Symfony\Component\Console;

require __DIR__ . '/../vendor/autoload.php';

$application = new Console\Application();
$application->add(new Application());

return $application;

然后您可能会遇到 PhpParser 错误

编译错误:无法声明接口 PhpParser\NodeVisitor,因为该名称已被使用

如果是这种情况,您应该为您的应用程序创建一个新的环境,该环境将禁用内联。在 config/packages/phpstan_env/parameters.yaml

parameters:
    container.dumper.inline_class_loader: false

在您的 console-application.php 中调用新的 env

$kernel = new \App\Kernel('phpstan_env', (bool) $_SERVER['APP_DEBUG']);