tbpixel/type-adapter

一个类型安全的包,用于将一种数据类型转换为另一种类型。

1.1.0 2019-03-20 04:23 UTC

This package is auto-updated.

Last update: 2024-09-21 20:41:15 UTC


README

Latest Version on Packagist Build Status

一个类型安全的包,用于将一种数据类型转换为另一种类型。

内容

安装

通过composer

composer require tbpixel/type-adapter

目的

您是否曾需要将一个实例(通常是一个数据传输对象)从一种类型转换为另一种类型?我发现自己在编写静态构造函数,例如

class Foo
{
    /** @var string **/
    public $name;
}

class Bar
{
    /** @var string **/
    public $name;
    
    public function __construct(string $name)
    {
        $this->name = $name;
    }

    public static function fromFoo(Foo $foo): self
    {
        return new self($foo->name);
    }
}

说实话,这对于开始来说是可以的,但它实际上在处理这些构造函数转换时创建了对象之间的紧密耦合。如果我想完全删除Foo,我必须去找到所有调用Bar类中fromFoo的地方!如果源类型来自一个包,这可能会变得更糟;可能需要将此包与应用程序解耦,但现在它在我的应用程序中被广泛引用。

这就是我创建Type Adapter包的原因。这个包允许进行松散耦合、类型安全的转换,而不需要静态构造函数。它试图减少耦合,并作为应用程序各层之间的通信转换器。它在六边形架构和领域驱动应用程序、软件开发中特别有用。

示例

以上面的类型为例,我们可以创建一个适配器,将Foo转换为Bar,如下所示

use TBPixel\TypeAdapter\Adaptable;

class FooToBarAdapter implements Adaptable
{
    /**
     * Adapts a Foo resource into a Bar resource.
     *
     * @param Foo $resource
     *
     * @return Bar
     */
    public function adapt($resource)
    {
        return new Bar($resource->name);
    }

    /**
     * Returns the acceptable valid resource type as either a string or an array.
     *
     * @return array|string
     */
    public function expects()
    {
        return Foo::class;
    }
}

在这里,你可以看到一些事情正在发生。首先,我们实现了这个包中定义的Adaptable接口。此接口要求我们实现一个adapt($resource)方法和一个expects()方法。

adapt方法接受资源,我们可以使用文档注释进行类型提示,然后返回转换后的类型。

expects方法用于类型安全。它为adapt方法定义了一个验证规则,这是允许我们进行类型安全的地方。

expects方法可以返回一个string类型的名称或一个包含字符串的array,用于可变参数类型。

贡献

有关详细信息,请参阅CONTRIBUTING

变更日志

有关最近更改的更多信息,请参阅CHANGELOG

支持我

嗨!我是一个居住在BC省温哥华的开发者。如果你想支持我,可以考虑在Twitter @TBPixel上关注我,或者买我一杯咖啡。谢谢!

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件