riverwaysoft/api-tools

0.2.9.6 2023-08-22 10:12 UTC

README

安装

composer req riverwaysoft/api-tools

包含内容

TelephoneObject

libphonenumber 和 PhoneNumberType 的包装,用于 DoctrineType。配置

doctrine:
    dbal:
        types:
            phone_number: Riverwaysoft\ApiTools\Telephone\Doctrine\DBAL\Types\TelephoneObjectType

ApiPlatform 扩展

额外的序列化器(枚举、TelephoneObject、Money)

配置

$services
    ->load('Riverwaysoft\\ApiTools\\ApiPlatform\\Serializer\\', __DIR__ . '/../vendor/riverwaysoft/api-tools/src/Lib/ApiPlatform/Serializer');

额外的过滤器(查看 riveradmin ;))

  • RiverAdminEnumSearchFilter
  • RiverAdminSearchFilter
  • RiverAdminBooleanFilter
  • AbstractFullTextSearchFilter

领域事件

使用方法

class UserRegisteredMessage {
    public function __construct(public string $username) {}
}

use Riverwaysoft\ApiTools\DomainEvents\EventSourceCollector;
class User extends EventSourceCollector {
    
    public function signUp(string $username){
        $this->rememberMessage(new UserRegisteredMessage($username));
    }
    
}

# After that message can be consumed with:

$user = new User();
$messages = $user->popMessages();

或者可以使用 doctrine 适配器自动完成

配置

    $services->set(Riverwaysoft\ApiTools\DomainEvents\Doctrine\DoctrineDomainEventsCollector::class)->public()
        ->tag('doctrine.event_listener', ['event' => "postPersist"])
        ->tag('doctrine.event_listener', ['event' => "postUpdate"])
        ->tag('doctrine.event_listener', ['event' => "postFlush"])
        ->tag('doctrine.event_listener', ['event' => "postLoad"]);

InputValueResolver

一组自动将 HTTP POST 主体和 GET 查询序列化为类型对象的序列化器。

#[Query] 属性的使用

class UserFilter
{
    public function __construct(
        public int $ageGreaterThan,
        public string $name,
    ) {
    }
}

class CreateUserInput {
    public function __construct(
        public int $age,
        public string $name,
    ) {
    } 
}

use Riverwaysoft\ApiTools\InputValueResolver\Query;
use Riverwaysoft\ApiTools\InputValueResolver\Input;

class UserController
{
    #[Route('/api/users', methods: ['GET'])]
    public function getUsers(#[Query] UserFilter $userFilter)
    {
        // Use $userFilter for requests like
        // /api/users?ageGreaterThan=18&name=test
    }
    
    #[Route('/api/users', methods: ['POST'])]
    public function createUser(#[Input] CreateUserInput $input)
    {
        // variable $input will be automatically created
        // from the request body   
    }
}

services.yml 中的配置

  Riverwaysoft\ApiTools\InputValueResolver\:
    resource: '../vendor/riverwaysoft/api-tools/src/InputValueResolver'

UnicodeIgnoreOrderJsonDriver

phpunit-snapshot-assertions 库提供的驱动程序。此驱动程序负责以下三个主要任务

  1. 显示未转义的 Unicode 字符,因此您将看到 "£" 而不是 "\u00a3"
  2. 忽略属性顺序。例如,相等的 JSON {a: 1, b: 2}{b: 2, a: 1}
  3. 忽略 JSON 中数组元素的顺序。例如,相等的 JSON 数组 [{a: 1}, {b: 2}][{b: 2}, {a: 1}]

如何使用

将以下 trait 添加到所有测试中

use Riverwaysoft\ApiTools\Testing\UnicodeIgnoreOrderJsonDriver;

//

public function assertMatchesJsonUnicodeSnapshot(mixed $actual): void
{
    $this->assertMatchesSnapshot($actual, new UnicodeIgnoreOrderJsonDriver());
}

使用 assertMatchesJsonUnicodeSnapshot 代替 assertMatchesJsonSnapshot