nish/phpstan-echo-html-rule

该软件包已被放弃且不再维护。作者建议使用 nish/phpstan-safestring-rule 软件包代替。

PHPStan 的 htmlspecialchars 检查器

v0.1.3 2019-12-21 08:47 UTC

This package is auto-updated.

Last update: 2020-01-09 06:57:13 UTC


README

此软件包是 PHPStan 扩展,用于检查是否从纯 PHP 模板中调用 htmlspecialchars。

安装

composer require --dev nish/phpstan-echo-html-rule

如何使用

添加到 phpstan.neon

includes:
  - vendor/nish/phpstan-echo-html-rule/rules.neon

如果您的 composer.json

    "autoload": {
        "psr-4": { "App\\": "src" },
        "files": [
            "src/functions.php"
        ]
    },

值对象类 src/ProductDto.php

<?php

namespace App;

class ProductDto
{
    /** @var int */
    public $product_id;
    /** @var string */
    public $name;
    /** @var ?string */
    public $description;
}

HTML 模板 src/ProductHtml.php

<?php
namespace App;
class ProductHtml {
    public function view(ProductDto $product): void {
?>

<div>
  <div>
    <?= $product->product_id ?>
  </div>
  <div>
    <?= $product->name ?>
  </div>
  <div>
    <?= $product->description ?>
  </div>
</div>

<?php
    }
}

在这种情况下,phpstan 的执行结果如下

 3/3 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%

 ------ ---------------------------------------------------- 
  Line   ProductHtml.php                                     
 ------ ---------------------------------------------------- 
  16     Parameter #1 (string) is not safehtml-string.       
  19     Parameter #1 (string|null) is not safehtml-string.  
 ------ ---------------------------------------------------- 

                                                                                
 [ERROR] Found 2 errors

您不能直接调用 echo 字符串类型。

由于 safehtml-string 是一个虚拟类型,可以通过添加一个辅助函数来修复。

src/functions.php:

<?php

/**
 * @param int|string|null $input
 * @return safehtml-string
 */
function h($input)
{
    return htmlspecialchars((string)$input);
}

/**
 * @param int|string|null $input
 * @return safehtml-string
 */
function raw($input)
{
    return (string)$input;
}

src/ProductHtml.php:

<?php
namespace App;
class ProductHtml {
    public function view(ProductDto $product): void {
?>

<div>
  <div>
    <?= $product->product_id ?>
  </div>
  <div>
    <?= h($product->name) ?>
  </div>
  <div>
    <?= h($product->description) ?>
  </div>
</div>

<?php
    }
}

提示

常量字符串类型不需要转换为 safehtml-string。

<?php
namespace App;
class TypeHtml {
    const CURRENT_TYPE_ID = 2;
    const TYPES = [
        1 => 'TYPE 1',
        2 => 'TYPE 2',
        3 => 'TYPE 3',
    ];
    public function view(): void {
?>

<div>
  <div>
    <?= self::CURRENT_TYPE_ID ?>
  </div>
  <div>
    <?= self::TYPES[self::CURRENT_TYPE_ID] ?>
  </div>
</div>

<?php
    }
}

这没有错误。