arnapou/ensure

库 - 一个简单的库,用于为SA工具生成更安全的PHP代码。

v2.6 2024-08-30 12:34 UTC

This package is auto-updated.

Last update: 2024-09-08 14:48:38 UTC


README

pipeline coverage

这个库是一个简单的工具,用于创建更安全的PHP代码。

出于质量原因以及/或者为静态分析工具(如PHPStanPsalm)进行类型检查,我们希望“确保”或“强制”类型检查。

安装

composer require arnapou/ensure

packagist 👉️ arnapou/ensure

确保

在下面的示例中,我们确保非约束的 intstring 被约束到类中。

use Arnapou\Ensure\Ensure;
use Arnapou\Ensure\Expected;

class MyObject
{
    /** @var positive-int */
    public int $id;

    /** @var non-empty-string */
    public string $name;

    /** 
     * @throws Expected 
     */
    public function __construct(int $id, string $name) 
    {
        $this->id = Ensure::positiveInt($id);
        $this->name = Ensure::nonEmptyString($name);
    }
}

强制

在下面的示例中,它可能来自遗留代码。我们在构造函数中有phpdoc类型提示。但从PHP的角度来看,它不够“硬”,改变 mixed 类型提示可能存在风险。

您可以使用 Enforce 在类内部保证类型提示,同时保持类型检查宽松。当值足够“安全”时,它将转换该值。

  • 有效的/自动转换的 int 示例: "1234""1.2e3"3.0true
  • 无效的 int 示例: "foo""1.234e2"3.14[]
use Arnapou\Ensure\Enforce;
use Arnapou\Ensure\Expected;

class MyObject
{
    /** @var positive-int */
    public int $id;

    /** @var non-empty-string */
    public string $name;

    /** 
     * @param int    $id
     * @param string $name
     *
     * @throws Expected 
     */
    public function __construct(mixed $id, mixed $name) 
    {
        $this->id = Enforce::positiveInt($id);
        $this->name = Enforce::nonEmptyString($name);
    }
}

消息自定义或翻译

您可以通过实现自己的 MessageFactoryInterface 来完成此操作,然后将其设置为 Expected 类的默认值。

class MyMessageFactory implements MessageFactoryInterface
{
    public function createExpectedMessage(string $expected, int $code, mixed $value, string $propertyName, mixed ...$parameters): string
    {
        // Build the message here.
    }
}

// Change the default message factory.
\Arnapou\Ensure\Expected::setMessageFactory(new MyMessageFactory());

ℹ️ 默认的 MessageFactory 实现是 final,您不能扩展它,但是 如果需要,您可以将其与组合一起重用。

class MyMessageFactory implements MessageFactoryInterface
{
    private \Arnapou\Ensure\MessageFactory\MessageFactory $internal;

    public function __construct(){
        $this->internal = new \Arnapou\Ensure\MessageFactory\MessageFactory();
    }

    public function createExpectedMessage(string $expected, int $code, mixed $value, string $propertyName, mixed ...$parameters): string
    {
        if (/* any logic you need */) {
            // Your customization here
        }
        
        // Default on the default message factory
        return $this->internal->createExpectedMessage($expected, $code, $value, $propertyName, ...$parameters);
    }
}

// Change the default message factory.
\Arnapou\Ensure\Expected::setMessageFactory(new MyMessageFactory());

PHP版本

日期引用8.38.2
25/11/20232.x,主版本×
17/05/20241.4.x××
23/08/20231.x×