nish / phpstan-echo-html-rule
v0.1.3
2019-12-21 08:47 UTC
Requires
- php: ~7.1
- nikic/php-parser: ^4.0
- phpstan/phpstan: ^0.12
Requires (Dev)
- phpstan/phpstan-phpunit: ^0.12
- phpunit/phpunit: ^7.0
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 } }
这没有错误。