php-unified / state
PHP应用状态的规范。
Requires
- php: ^7.2
Requires (Dev)
- phpunit/phpunit: ^7.5
- squizlabs/php_codesniffer: ^3.4
README
PHP Unified State
此包提供了一种在PHP中跟踪应用状态的规范。该包旨在创建一个多用途的标准。
此包包含用于跟踪状态接口和简单实现的代码。
安装
composer require php-unified/state
用法
提供接口
PhpUnified\State\Common\StateTrackerInterface
此接口表示可以提供一个可选的 StateInterface 接口。实现此接口的类将跟踪状态值(可选)。
PhpUnified\State\Common\StateInterface
此接口提供了一种将状态跟踪实现到应用中的标准。以下功能需要实现。
对于此接口,已提供了一种实现。请参阅:PhpUnified\State\State。
设置器和获取器
对象有2个设置器和2个获取器。这些方法包括:
setValue和getValue用于设置和获取对象的值。setIdentifier和getIdentifier用于设置和获取对象的标识符。
导出状态
字符串转换
__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了解最近更改的详细信息。
贡献
请参阅CONTRIBUTING 和 CODE_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
特此授予任何人免费获得本软件及其相关文档文件(“软件”)副本的权利,无需限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向提供软件的个人提供此类软件,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的副本或主要部分中。
本软件按“原样”提供,不提供任何形式的保证,无论是明示的、默示的,包括但不限于对适销性、特定用途适用性和非侵权的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论基于合同行为、侵权或其他行为,均与软件或使用软件或其他与软件相关的活动无关。