monday-factory / database-model
dev-master
2020-03-05 17:09 UTC
Requires
- php: ^7.2
- dibi/dibi: ^4.0
- nette/utils: ^2.4
Requires (Dev)
- monday-factory/php-code-checker: ^1.0
- phpstan/phpstan: ^0.10.5
- phpstan/phpstan-strict-rules: ^0.10
- slevomat/coding-standard: ^4.0
This package is auto-updated.
Last update: 2024-09-30 15:23:12 UTC
README
- Collection\IDatabaseDataCollection
| └ Collection\BaseDatabaseDataCollection
|
- Data\IDatabaseData
|
- Storage\ILowLevelRelationalDatabaseStorage
└ Storage\ALowLevelRelationalDatabaseStorage
- Storage\IRelationalDatabaseStorage
概念层次
Presenter
|
Mediator
/ \
MiddleLevelApi SomeClient/Api
/
LowLevelApi
基本用法
Composer
{ "type": "project", "autoload": { "psr-4": { "App\\": "app/" } }, "repositories": { "database-model": { "type": "vcs", "url": "ssh://git@gitlab.mondayfactory.cz:2222/mondayfactory/database-model.git" } }, "require": { "monday-factory/database-model": "dev-master" } }
数据类
这个数据类有两个属性。$tokenUuid 通过构造函数由用户传递,$updated 只能在 $data 通过方法 fromRow 传递。From row 是在数据获取过程中由 Storage\ALowLevelRelationalDatabaseStorage 使用的工厂。
<?php declare(strict_types=1); namespace T2p\Common\Rancher\Service\Data; use Dibi\Row; use Ramsey\Uuid\Uuid; use Ramsey\Uuid\UuidInterface; use T2p\Common\AbstractModel\Data\IDatabaseData; use T2p\Common\Rancher\Service\StatusEnum; class StatusData implements IDatabaseData { /** * @var UuidInterface */ private $tokenUuid; /** * @var \DateTime */ private $updated; /** * @param UuidInterface $tokenUuid */ public function __construct(UuidInterface $tokenUuid) { $this->tokenUuid = $tokenUuid; } /** * @param iterable $data [<br> * UuidInterface tokenUuid,<br> * ] * * @return IDatabaseData */ public static function fromData(iterable $data): IDatabaseData { return new self( $data['tokenUuid'] ); } /** * @param Row $row * * @return $this * @throws \Exception */ public static function fromRow(iterable $row): IDatabaseData { return (new self( Uuid::fromString($row['token_uuid']) ) ) ->setUpdated($row['updated']); } public function toArray(): array { return get_object_vars($this); } /** * @return array */ public function toDatabaseArray(): array { return [ 'tokenUuid' => $this->tokenUuid->toString(), ]; } /** * @return UuidInterface */ public function getTokenUuid(): UuidInterface { return $this->tokenUuid; } /** * @return \DateTimeImmutable */ public function getUpdated(): \DateTimeImmutable { return $this->updated; } /** * @var \DateTimeImmutable $updated */ private function setUpdated(\DateTimeImmutable $updated) { $this->updated = $updated; return $this; } }
集合工厂
对于集合只需要实现一个方法 ::create()。在数据获取过程中,Storage\ALowLevelRelationalDatabaseStorage 会内部调用这个工厂。
<?php declare(strict_types=1); namespace T2p\Common\Rancher\Service\Collection; use T2p\Common\AbstractModel\Colection\BaseDatabaseDataCollection; use T2p\Common\AbstractModel\Colection\IDatabaseDataCollection; use T2p\Common\Rancher\Service\Data\StatusData; class StatusCollection extends BaseDatabaseDataCollection { /** * @param array $data * * @return StatusCollection */ public static function create(array $data, ?string $idField = null): IDatabaseDataCollection { return new static($data, StatusData::class, $idField); } }
低级数据库存储实例
这个实例在高级存储中用于与数据库通信。您必须实现三个参数
$tableName
// 数据库表名。$rowFactoryClass
//StatusData
定义在上面。$collectionFactory
//StatusCollection
定义在上面。
和可选的
$idField
// 如果设置,此数据库字段的值用作Collection\IDatabaseDataCollection
中的键,否则是零索引的数组。如果没有设置$idField
,结果集的唯一值将引发UnexpectedValueException
。您可以使用简单名称,例如 'id' 用于标量值,或者可以使用例如 'uuid->toString()' 将 UuidInterface 序列化为集合项的键。
<?php declare(strict_types=1); namespace T2p\Common\Rancher\Service\Storage; use T2p\Common\AbstractModel\Storage\ALowLevelRelationalDatabaseStorage; use T2p\Common\Rancher\Service\Collection\StatusCollection; use T2p\Common\Rancher\Service\Data\StatusData; class StatusDatabaseLowLevelStorage extends ALowLevelRelationalDatabaseStorage { /** * @var string */ protected $tableName = 'token_rancher_service_status'; /** * @var string */ protected $rowFactoryClass = StatusData::class; /** * @var string */ protected $collectionFactory = StatusCollection::class; /** * @var scalar */ protected $idField; }
数据库存储
数据库存储是中间层数据库存储。在这个类中实现了例如 public function getShouldActiveContainersByType(string $containerType)
的方法。
<?php declare(strict_types=1); namespace T2p\Common\Rancher\Service\Storage; use MondayFactory\DatabaseModel\Colection\IDatabaseDataCollection; use MondayFactory\DatabaseModel\Storage\IRelationalDatabaseStorage; use MondayFactory\DatabaseModel\Storage\IStorage; class StatusDatabaseStorage implements IRelationalDatabaseStorage { /** * @var StatusDatabaseLowLevelStorage */ private $storage; /** * @param StatusDatabaseLowLevelStorage $lowLevelStorage */ public function __construct(StatusDatabaseLowLevelStorage $storage) { $this->storage = $storage; } /** * @return IDatabaseDataCollection */ public function getActiveServices(): IDatabaseDataCollection { return $this->storage->findByCriteria([ 'status = "new"', ] ); } }
中介
中介是高级 API(外观)。中介使用例如 Rancher\Client
和 StatusDatabaseStorage
,并为管理依赖于这两个 API 的操作提供功能。
<?php declare(strict_types=1); namespace T2p\Common\Rancher\Service; use T2p\Common\Rancher\Service\Storage\StatusDatabaseStorage; use Tyldar\Rancher\Client; class Mediator { /** * @var Client */ private $rancherClient; /** * @var StatusDatabaseStorage */ private $databaseStorage; /** * @param Client $rancher * @param StatusDatabaseStorage $databaseStorage */ public function __construct(Client $rancher, StatusDatabaseStorage $databaseStorage) { $this->databaseStorage = $databaseStorage; $this->rancherClient = $rancher; } public function createRecreateMessagesForIllContainers() { $shouldBeActiveContainers = $this->databaseStorage->getActiveServices(); $containersStatuses = $this->rancherClient->getAllContainers(); // compare, create messages etc. } }
config.neon
services: - T2p\Common\Rancher\Service\Storage\StatusDatabaseLowLevelStorage - T2p\Common\Rancher\Service\Storage\StatusDatabaseStorage - T2p\Common\Rancher\Service\Mediator