PHP应用状态的规范。

1.0.4 2020-03-05 20:25 UTC

This package is auto-updated.

Last update: 2024-09-06 06:56:06 UTC


README

Build Status

PHP Unified State

此包提供了一种在PHP中跟踪应用状态的规范。该包旨在创建一个多用途的标准。

此包包含用于跟踪状态接口和简单实现的代码。

安装

composer require php-unified/state

用法

提供接口

PhpUnified\State\Common\StateTrackerInterface

此接口表示可以提供一个可选的 StateInterface 接口。实现此接口的类将跟踪状态值(可选)。

PhpUnified\State\Common\StateInterface

此接口提供了一种将状态跟踪实现到应用中的标准。以下功能需要实现。

对于此接口,已提供了一种实现。请参阅:PhpUnified\State\State

设置器和获取器

对象有2个设置器和2个获取器。这些方法包括:

  • setValuegetValue 用于设置和获取对象的值。
  • setIdentifiergetIdentifier 用于设置和获取对象的标识符。
导出状态
字符串转换

__toString 方法输出的结果应将状态转换为人类可读的字符串。单个状态的结果可能如下所示:

version: 1.0.0

其中 version 是设置标识符,1.0.0 是设置版本。

对于具有多个子状态的状态,输出可能如下所示:

packages:
    name: php-unified/state
    version: 1.0.0

每一行代表一个新的状态,包含相应的 identifier: value 对。

数组转换

导出状态到数组的函数是 exportState。该方法的输出可能如下所示:

$output = [
    'packages' => '',
    'states' => [
        'name' => 'php-unified/state',
        'version' => '1.0.0'
    ]
]
添加子状态

要将状态添加到状态中,需要实现 addState 方法。这些状态应该在导出状态的实现中进行迭代。

变更日志

请参阅CHANGELOG了解最近更改的详细信息。

贡献

请参阅CONTRIBUTINGCODE_OF_CONDUCT了解详细信息。

技巧

使用嵌套状态

通过使用嵌套状态的方法,应用程序可以主动更新其值。这将导致一个包含状态的单一仓库,可用于记录日志。从而为调试提供更多见解。

例如,应用程序可以像这样监视数据库连接的最后一个操作:

use PhpUnified\State\State;
use Application\Database\Connection;
use Application\Logger\Logger;

$systemState = new State();
$systemState->setIdentifier('system-state');

$databaseTransactionState = new State();
$databaseTransactionState->setIdentifier('last-db-transaction-state');

$systemState->addState($databaseTransactionState);

$logger = new Logger();
$connection = new Connection($databaseTransactionState);
try {
    $connection->doQuery();
} catch (Throwable $e) {
    $logger->log('warning', $e->getMessage());
    $logger->info($systemState->__toString());
}

然后(虚构的)Connection类可能如下所示:

namespace Application\Database;

use PhpUnified\State\Common\StateInterface;

class Connection
{
    /**
     * State tracker
     *
     * @var StateInterface
     */
    private $state;

    /**
     * Constructor
     *
     * @param StateInterface $state
     */
    public function __construct(StateInterface $state)
    {
        $this->state = $state;
    }

    /**
     * Fictional doQuery function
     *
     * @return void
     */
    public function doQuery(): void
    {
        $state->setValue('Starting database connection');
        $connection = connectToDatabase();

        $state->setValue('Starting transaction');
        $connection->startTransaction();

        $state->setValue('Executing transaction');
        if($connection->doTransaction()) {
            $state->setValue(
                sprintf(
                    'Transaction with id %d transaction success',
                    $connection->getLastTransactionId()
                )
            );
            return true;
        }

        $state->setValue('Rolling back transaction');
        $connection->rollBackTransaction();
        $state->setValue('Rollback executed');
    }
}

如果在doQuery函数中的任何上述功能调用会导致抛出异常,则最新状态仍可以记录。

MIT许可证

版权(c)2019 GrizzIT

特此授予任何人免费获得本软件及其相关文档文件(“软件”)副本的权利,无需限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向提供软件的个人提供此类软件,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的副本或主要部分中。

本软件按“原样”提供,不提供任何形式的保证,无论是明示的、默示的,包括但不限于对适销性、特定用途适用性和非侵权的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论基于合同行为、侵权或其他行为,均与软件或使用软件或其他与软件相关的活动无关。