monday-factory/database-model

dev-master 2020-03-05 17:09 UTC

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\ClientStatusDatabaseStorage,并为管理依赖于这两个 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