首页 > 后端开发 > php教程 > 在 PHP 中实现 DDD 用例

在 PHP 中实现 DDD 用例

Patricia Arquette
发布: 2024-11-12 22:18:02
原创
1009 人浏览过

Implementing a DDD Use Case in PHP

在 PHP 中实现 DDD 用例

本文探讨了 PHP 中的领域驱动设计 (DDD) 用例模型,演示了如何利用接口和特定于领域的类来管理数据持久性。我们将检查 TaxPersistUseCase 类,它使用持久性管理器 (TaxManagerInterface) 来保存代表税的 Tax 类型的实体。

该模型强调 DDD 原则:每个组件都清晰地分为接口、具体实现和异常,遵循依赖注入和错误处理的最佳实践。

TaxPersist用例的结构

TaxPersistUseCase 类处理与持久税收相关的业务逻辑。它分为几个部分来阐明这种方法的逻辑和结构。

依赖声明

namespace Domain\Application\UseCase\Order;

use Domain\Application\Entity\Order\Tax;
use Domain\Application\Gateway\Manager\Order\TaxManagerInterface;
use Domain\Application\UseCase\Order\Exception\NotFoundException;
use Domain\Application\UseCase\Order\Interfaces\TaxPersistRequestInterface;
use Domain\Application\UseCase\Order\Interfaces\TaxPersistResponseInterface;
use Domain\Exception\BadRequestException;
use Domain\Exception\FormException;
use Small\CleanApplication\Contract\UseCaseInterface;
use Small\Collection\Collection\StringCollection;
use Small\SwooleEntityManager\EntityManager\Exception\EmptyResultException;
登录后复制
登录后复制

TaxPersistUseCase 类依赖于多个接口和异常来处理税务持久性。以下是他们的角色细分:

TaxManagerInterface :税务持久性管理器的接口。

TaxPersistRequestInterface 和 TaxPersistResponseInterface :用例请求和响应的接口。
异常:各种异常,例如 BadRequestException、FormException 和 NotFoundException,有助于管理特定于上下文的错误。

TaxPersistUseCase 类的实现

namespace Domain\Application\UseCase\Order;

use Domain\Application\Entity\Order\Tax;
use Domain\Application\Gateway\Manager\Order\TaxManagerInterface;
use Domain\Application\UseCase\Order\Exception\NotFoundException;
use Domain\Application\UseCase\Order\Interfaces\TaxPersistRequestInterface;
use Domain\Application\UseCase\Order\Interfaces\TaxPersistResponseInterface;
use Domain\Exception\BadRequestException;
use Domain\Exception\FormException;
use Small\CleanApplication\Contract\UseCaseInterface;
use Small\Collection\Collection\StringCollection;
use Small\SwooleEntityManager\EntityManager\Exception\EmptyResultException;
登录后复制
登录后复制
  • 构造函数和依赖注入:构造函数注入一个 TaxManagerInterface 实例,将 Tax 对象的持久性委托给该实例,而不将 TaxPersistUseCase 耦合到特定实现。
  • 请求类型检查:execute 方法验证 $request 对象是否实现了 TaxPersistRequestInterface。这确保收到的请求符合预期的合同,提供接口级验证。
  • 持久化税收对象:如果请求有效,则用例通过 getTax() 从 $request 中提取税收对象,并调用 TaxManagerInterface 上的 applicationPersist 方法。这个持久化过程被封装在一个try-catch块中来处理潜在的异常
  • EmptyResultException:如果未找到 Tax 实体,则会捕获此异常并抛出 NotFoundException 来表示错误。
  • FormException:如果表单验证失败,则会捕获 FormException,并将错误消息存储在 StringCollection 中。
  • 通过匿名类的动态响应:匿名类实现 TaxPersistResponseInterface 以返回用例的响应。它包括 getTax() 和 getMessages() 方法,分别允许访问税务实体和任何错误消息。

用例接口

接口定义了每个组件必须遵守的契约,促进解耦和可测试性。

税务管理界面

该接口指定了管理税收的方法,包括检索和持久化:

class TaxPersistUseCase implements UseCaseInterface
{

    public function __construct(
        protected TaxManagerInterface $taxManager,
    ) {}

    public function execute(mixed $request): TaxPersistResponseInterface
    {

        if (!$request instanceof TaxPersistRequestInterface) {
            throw new BadRequestException(
                self::class . ' accepts only request instance of ' . TaxPersistRequestInterface::class
            );
        }

        $tax = $request->getTax();
        $messages = new StringCollection();

        try {
            $this->taxManager->applicationPersist($tax);
        } catch (EmptyResultException $e) {
            throw new NotFoundException($e->getMessage());
        } catch (FormException $e) {
            $messages = $e->getFormMessages();
        }

        return new class($tax, $messages) implements TaxPersistResponseInterface
        {
            public function __construct(
                protected readonly Tax $tax,
                protected readonly StringCollection $messages,
            ) {}

            public function getTax(): Tax
            {
                return $this->tax;
            }

            public function getMessages(): StringCollection
            {
                return $this->messages;
            }
        };

    }

}
登录后复制
  • findById() 和 findByName():这些方法可以通过 ID 或名称检索税款。
  • applicationPersist():此方法确保税务实体的持久性。

TaxPersistRequest接口

该接口定义了 TaxPersistUseCase 所期望的请求的结构:

interface TaxManagerInterface
{
    public function findById(int $id): Tax;
    public function findByName(string $name): Tax;
    public function applicationPersist(Tax $tax): self;
}
登录后复制
  • getTax() :该方法返回要持久保存的 Tax 实体,允许用例直接访问相关领域对象。 TaxPersistResponse接口
  • 响应接口确保 TaxPersistUseCase 返回合规的响应:
interface TaxPersistRequestInterface extends RequestInterface
{
    public function getTax(): Tax;
}
登录后复制
  • getTax():返回持久化的税务实体,如果发生错误则返回 null。
  • getMessages():如果发生表单错误,则返回包含错误消息的 StringCollection。

错误和异常处理

异常通过捕获特定于域的错误在 DDD 中发挥着重要作用:

  • BadRequestException:如果用例收到错误类型的请求,则抛出。
  • NotFoundException:当找不到所寻求的税务实体时抛出。
  • FormException:捕获以处理验证错误,错误消息在 StringCollection 中返回。

以上是在 PHP 中实现 DDD 用例的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板