mcustiel/php-simple-conversion

一个简单且极简的库,用于在不同的类型和类之间进行转换

v1.3.1 2018-01-05 21:38 UTC

This package is auto-updated.

Last update: 2024-09-19 09:01:28 UTC


README

这是什么?

php-simple-conversion 是一个针对 PHP 的极简转换服务。它旨在高效且易于使用。它允许开发者注册一系列转换类,用于从一个类型转换到另一个类型。转换类仅在需要时才被实例化,从而最小化内存使用并避免不必要的处理。

Build Status Code Coverage Scrutinizer Code Quality

安装

Composer

该项目已在 Packagist 上发布,因此您只需将其添加到 composer.json 中的依赖项即可。

"require": {
        // ...
        "mcustiel/php-simple-conversion": "*"
    }

或者直接下载发行版并将其包含到您的路径中。

如何使用它?

定义您的转换器

首先,您必须定义您将要使用的转换器。例如,假设您有两个表示人的类:一个表示它在数据库中持久化的格式,另一个表示它在应用程序逻辑中使用的格式。

class DatabaseRegisterRepresentationForPerson 
{
    private $id;
    private $jsonString;

    public function __construct($id, $jsonString)
    {
        $this->id = $id;
        $this->jsonString = $jsonString;
    }
    // ... Getters and setters
}

class DomainRepresentationForPerson
{
    private $id;
    private $firstName;
    private $lastName;
    private $age;
    
    // ... Getters and setters
}

您需要一个服务来抽象对数据库的访问,在该服务中,您将使用转换器将 DAO 返回的类从用于逻辑的类转换,并返回它。以下是您服务应使用的转换器示例。

use Mcustiel\PhpSimpleConversion\Converter;

// class DBPersonToLogicPersonConverter (MUST implement Converter interface)
class DBPersonToLogicPersonConverter implements Converter
{
    public function convert($a)
    {
        if (! ($a instanceof DatabaseRegisterRepresentationForPerson)) {
            throw new \InvalidArgumentException("Should convert only from DatabaseRegisterRepresentationForPerson");
        }
        $return = new DomainRepresentationForPerson();

        $return->setId($a->getId());
        $object = json_decode($a->getJsonString());
        $return->setFirstName($object->firstName);
        $return->setLastName($object->lastName);
        $return->setAge($object->age);

        return $return;
    }
}

您可以根据需要定义所有转换器,然后注册它们。

注册

在您的引导文件(或某些启动脚本)中,您必须注册您定义的所有转换器。

use Mcustiel\PhpSimpleConversion\ConversionService;
use Mcustiel\PhpSimpleConversion\ConverterBuilder;

$conversionService = new ConversionService();
// ...
$converter = ConverterBuilder::get()
    ->from(DatabaseRegisterRepresentationForPerson::class)
    ->to(DomainRepresentationForPerson::class)
    ->withImplementation(DBPersonToLogicPersonConverter::class); // Implementation could be the name of the class or an instance
$conversionService->registerConverter($converter);

转换

然后,您只需要将转换服务注入到任何需要进行转换的类中,并按照以下方式调用它

    $dbPerson = $personDao->getPerson('alice');
    $logicPerson = $conversionService->convert($dbPerson, DomainRepresentationForPerson::class);

库将自动处理解决已注册的服务并调用它以将您的对象转换为所需的类型。

从父类转换

可选地,您可以告诉转换服务搜索为父类配置的转换器。假设您有一个从类 C 继承的类 B,一个从 C 到 A 的转换器,并且您想从 B 转换到 A。通过告诉转换器搜索父类的转换器,这是可能的

use Mcustiel\PhpSimpleConversion\ConversionService;
use Mcustiel\PhpSimpleConversion\ConverterBuilder;

$conversionService = new ConversionService();
// ...
$converter = ConverterBuilder::get()
    ->from(C::class)
    ->to(A::class)
    ->withImplementation(CtoAConverter::class);
$conversionService->registerConverter($converter);
$b = new B();
$a = $conversionService->convert($b, A::class, ConversionService::ALLOW_PARENTS);

注意

目前,您只能在转换器构建器中将 'string'、'array' 或完整类名设置为 'from' 和 'to' 参数。