举报投诉联系我们 手机版 热门标签 鳄鱼CMS
您的位置:鳄鱼CMS > php存储引擎 PHP 存储库模式

php存储引擎 PHP 存储库模式

2023-03-30 14:31 PHP设计模式

php存储引擎 PHP 存储库模式

php存储引擎

PHP存储引擎是一种用于存储和管理数据的软件系统,它可以帮助开发人员快速地创建、修改和删除数据库中的数据。它也可以帮助开发人员快速地执行复杂的SQL查询,并且返回准确的结果。

PHP存储引擎有很多不同的选项,其中最常用的是MySQL、PostgreSQL和SQLite。MySQL是一个关系型数据库,它使用SQL语言来存储、修改和删除数据库中的数据。PostgreSQL是一个对象关系映射(ORM)数据库,它使用特定的语法来存储、修改和删除数据库中的对象。而SQLite是一个文件型数据库,它使用特定的语法来存储、修改和删除文件中的数据。

MySQL是最流行的PHP存储引擎之一,因为它能够快速地执行复杂的SQL语句并返回准确的结果。此外,MySQL还具有很好的性能特性:它能够快速地处理大量数据并返回准确的结果。此外,MySQL还具有很好的可扩展性特性:当你想要扩大你的Web应用时,你可以很容易地将MySQL集成到你新Web应用中去。

PostgreSQL也是一个流行而强大的PHP存储引擎之一。PostgreSQL使用ORM语法来存储、保存和删除对象。此外,PostgreSQL也具有很好性能特性——当你想要扩大你Web应用时;PostgreSQL也能快速地处理大量数量并返回准确耗时少于MySQL 的 结 果 。 此 外 ; PostgreSQL 还 具 有 很 好 的 可 扩 展 性 特 性 ; 你 可 以 非 常 轻 松 地 向 你 的 Web 应 用 中 集 成 PostgreSQL 。

最后要说明 SQLite ; SQLite 是一个文件数 据库 ; 具 有 较 高 的 高 性 能 ; 这 使 得 SQLite 非常适合于小型Web应用或者单独使用时测试代码或者作为内部工具使用时测试代码或者作为内部工具使用时测试代码或者作为内部工具使用时测试代码或者作为内部工具使用时测试代码或者作为内部工具使用时测试代码或者作为内部工具使用时测试代码或者作为内

PHP 存储库模式

目的

使用类集合接口访问域对象,在域和数据映射层之间进行调解。存储库封装了持久化在数据存储中的一组对象以及对它们执行的操作,从而提供了持久层的更加面向对象的视图。存储库还支持实现域和数据映射层之间的清晰分离和单向依赖的目标。

例子

  • Doctrine 2 ORM:有 Repository 在 Entity 和 DBAL 之间进行调解,并包含检索对象的方法
  • Laravel 框架

UML 图

Alt 存储库 UML 图

代码

Post.php

<?php

declare(strict_types=1);

namespace DesignPatternsMoreRepositoryDomain;

class Post
{
    public static function draft(PostId $id, string $title, string $text): Post
    {
        return new self(
            $id,
            PostStatus::fromString(PostStatus::STATE_DRAFT),
            $title,
            $text
        );
    }

    public static function fromState(array $state): Post
    {
        return new self(
            PostId::fromInt($state["id"]),
            PostStatus::fromInt($state["statusId"]),
            $state["title"],
            $state["text"]
        );
    }

    private function __construct(
        private PostId $id,
        private PostStatus $status,
        private string $title,
        private string $text
    ) {
    }

    public function getId(): PostId
    {
        return $this->id;
    }

    public function getStatus(): PostStatus
    {
        return $this->status;
    }

    public function getText(): string
    {
        return $this->text;
    }

    public function getTitle(): string
    {
        return $this->title;
    }
}

PostId.php

<?php

declare(strict_types=1);

namespace DesignPatternsMoreRepositoryDomain;

use InvalidArgumentException;


class PostId
{
    public static function fromInt(int $id): PostId
    {
        self::ensureIsValid($id);

        return new self($id);
    }

    private function __construct(private int $id)
    {
    }

    public function toInt(): int
    {
        return $this->id;
    }

    private static function ensureIsValid(int $id)
    {
        if ($id <= 0) {
            throw new InvalidArgumentException("Invalid PostId given");
        }
    }
}

PostStatus.php

<?php

declare(strict_types=1);

namespace DesignPatternsMoreRepositoryDomain;

use InvalidArgumentException;


class PostStatus
{
    public const STATE_DRAFT_ID = 1;
    public const STATE_PUBLISHED_ID = 2;

    public const STATE_DRAFT = "draft";
    public const STATE_PUBLISHED = "published";

    private static array $validStates = [
        self::STATE_DRAFT_ID => self::STATE_DRAFT,
        self::STATE_PUBLISHED_ID => self::STATE_PUBLISHED,
    ];

    public static function fromInt(int $statusId)
    {
        self::ensureIsValidId($statusId);

        return new self($statusId, self::$validStates[$statusId]);
    }

    public static function fromString(string $status)
    {
        self::ensureIsValidName($status);
        $state = array_search($status, self::$validStates);

        if ($state === false) {
            throw new InvalidArgumentException("Invalid state given!");
        }

        return new self($state, $status);
    }

    private function __construct(private int $id, private string $name)
    {
    }

    public function toInt(): int
    {
        return $this->id;
    }

    
    public function toString(): string
    {
        return $this->name;
    }

    private static function ensureIsValidId(int $status)
    {
        if (!in_array($status, array_keys(self::$validStates), true)) {
            throw new InvalidArgumentException("Invalid status id given");
        }
    }


    private static function ensureIsValidName(string $status)
    {
        if (!in_array($status, self::$validStates, true)) {
            throw new InvalidArgumentException("Invalid status name given");
        }
    }
}

PostRepository.php

<?php

declare(strict_types=1);

namespace DesignPatternsMoreRepository;

use OutOfBoundsException;
use DesignPatternsMoreRepositoryDomainPost;
use DesignPatternsMoreRepositoryDomainPostId;


class PostRepository
{
    public function __construct(private Persistence $persistence)
    {
    }

    public function generateId(): PostId
    {
        return PostId::fromInt($this->persistence->generateId());
    }

    public function findById(PostId $id): Post
    {
        try {
            $arrayData = $this->persistence->retrieve($id->toInt());
        } catch (OutOfBoundsException $e) {
            throw new OutOfBoundsException(sprintf("Post with id %d does not exist", $id->toInt()), 0, $e);
        }

        return Post::fromState($arrayData);
    }

    public function save(Post $post)
    {
        $this->persistence->persist([
            "id" => $post->getId()->toInt(),
            "statusId" => $post->getStatus()->toInt(),
            "text" => $post->getText(),
            "title" => $post->getTitle(),
        ]);
    }
}

Persistence.php

<?php

declare(strict_types=1);

namespace DesignPatternsMoreRepository;

interface Persistence
{
    public function generateId(): int;

    public function persist(array $data);

    public function retrieve(int $id): array;

    public function delete(int $id);
}

InMemoryPersistence.php

<?php

declare(strict_types=1);

namespace DesignPatternsMoreRepository;

use OutOfBoundsException;

class InMemoryPersistence implements Persistence
{
    private array $data = [];
    private int $lastId = 0;

    public function generateId(): int
    {
        $this->lastId++;

        return $this->lastId;
    }

    public function persist(array $data)
    {
        $this->data[$this->lastId] = $data;
    }

    public function retrieve(int $id): array
    {
        if (!isset($this->data[$id])) {
            throw new OutOfBoundsException(sprintf("No data found for ID %d", $id));
        }

        return $this->data[$id];
    }

    public function delete(int $id)
    {
        if (!isset($this->data[$id])) {
            throw new OutOfBoundsException(sprintf("No data found for ID %d", $id));
        }

        unset($this->data[$id]);
    }
}

测试

Tests/PostRepositoryTest.php

<?php

declare(strict_types=1);

namespace DesignPatternsMoreRepositoryTests;

use OutOfBoundsException;
use DesignPatternsMoreRepositoryDomainPostId;
use DesignPatternsMoreRepositoryDomainPostStatus;
use DesignPatternsMoreRepositoryInMemoryPersistence;
use DesignPatternsMoreRepositoryDomainPost;
use DesignPatternsMoreRepositoryPostRepository;
use PHPUnitFrameworkTestCase;

class PostRepositoryTest extends TestCase
{
    private PostRepository $repository;

    protected function setUp(): void
    {
        $this->repository = new PostRepository(new InMemoryPersistence());
    }

    public function testCanGenerateId()
    {
        $this->assertEquals(1, $this->repository->generateId()->toInt());
    }

    public function testThrowsExceptionWhenTryingToFindPostWhichDoesNotExist()
    {
        $this->expectException(OutOfBoundsException::class);
        $this->expectExceptionMessage("Post with id 42 does not exist");

        $this->repository->findById(PostId::fromInt(42));
    }

    public function testCanPersistPostDraft()
    {
        $postId = $this->repository->generateId();
        $post = Post::draft($postId, "Repository Pattern", "Design Patterns PHP");
        $this->repository->save($post);

        $this->repository->findById($postId);

        $this->assertEquals($postId, $this->repository->findById($postId)->getId());
        $this->assertEquals(PostStatus::STATE_DRAFT, $post->getStatus()->toString());
    }
}


阅读全文
以上是鳄鱼CMS为你收集整理的php存储引擎 PHP 存储库模式全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 鳄鱼CMS eyucms.com 版权所有 联系我们