stesie/phpstan-doctrine-checker

PHPStan Doctrine checker 用于查找无效的、过滤的 fetch-join 查询。

dev-master 2017-08-26 19:31 UTC

This package is not auto-updated.

Last update: 2024-09-15 04:10:42 UTC


README

Build Status Coverage Status PHPStan License

PHPStan Doctrine Checker 是 PHPStan 的扩展,它为 PHPStan 提供了额外的检查。

如果没有神奇的 PHPStan 工具,这个项目将无法实现。如果您考虑使用这个扩展,您也应该添加 phpstan-doctrine 扩展。

到目前为止,这只是一个概念验证,实际上不可用

首要目标是查找 Doctrine 的 QueryBuilder 构建无效的(fetch-join)查询的使用情况,这些查询是在过滤关联上进行的。这些问题很容易被忽略,并且在代码的另一个完全不同的点爆炸。

考虑这个

$user = $this->_em->createQueryBuilder()
    ->select('u', 'p')
    ->from(User::class, 'u')
    ->join('u.phoneNumbers', 'p')
    ->where('p.type = :type')->setParameter('type', 'work')
    ->getQuery()
    ->getResult();

这里关联的 phoneNumbers 是通过 fetch-join 和过滤来获取的。如果这个查询再次执行,比如所有类型为 "home" 的号码,那么 Doctrine 将 不会 重新水化已经水化的 User 实体,因此那些实体仍然会附加工作电话号码。

用法

要使用此扩展,请使用 composer

composer require --dev stesie/phpstan-doctrine-checker=@dev

并将 src/phpstan.neon 包含在您的项目 PHPStan 配置中

includes:
	- vendor/stesie/phpstan-doctrine-checker/src/phpstan.neon

路线图

到目前为止,这个项目更多的是一个概念验证,实际上不实用。

我希望看到实现的功能

  • 处理所有将对象水化的 getResult 变体(忽略其余部分)
  • 更健壮地解析各种 $qb->expr()->xxx 过滤
  • 对于(非空?)xxxToOne 关系上的过滤,不要发出警告,因为这些应该消除根(因此不会导致部分水化的对象)
  • 回传在内部连接的相关表上执行的过滤,即如果您连接了 foo 和 bar 表,但 baz(依赖于 bar)被过滤掉...那么如果 baz 被过滤掉,它将消除 bar,并且(可能)只部分水化 foo。
  • 解析原始 DQL

贡献

欢迎任何贡献。