gowork/safe

类型安全工具

v0.2.2 2023-02-08 20:46 UTC

This package is auto-updated.

Last update: 2024-09-09 00:12:58 UTC


README

Safe accessors 对不安全或不确定的关联数据结构进行包装,并提供安全类型转换的方法。主要适用于 Symfony。

SafeAccessorTrait 方法

bool(string $key, bool $default = false): bool

  • 如果可能,将值转换为 bool (true, false, 0, 1)
  • 如果设置值但无法转换,则抛出 InvalidArgumentException
  • 如果未设置值,则返回默认值

boolOrDefault(string $key, bool $default): bool

  • 将值转换为 bool (true, false, 0, 1)
  • 或返回默认值

string(string $key, string $default = ''): string

  • 如果可能,将值转换为 string
  • 如果设置值但无法转换,则抛出 InvalidArgumentException
  • 如果未设置值,则返回默认值

stringNullable(string $key, ?string $default = null): ?string

  • 如果可能,将值转换为 string
  • 如果未设置值或值为 null,则返回默认值
  • 如果值不是 null 但无法转换,则抛出 InvalidArgumentException

stringOrNull(string $key): ?string

  • 如果可能,将值转换为 string
  • 或返回 null

stringOrDefault(string $key, string $default): string

  • 如果可能,将值转换为 string
  • 或返回默认值

int(string $key, int $default = 0): int

  • 如果可能,将值转换为 int
  • 如果设置值但无法转换,则抛出 InvalidArgumentException
  • 如果未设置值,则返回默认值

intNullable(string $key, ?int $default = null): ?int

  • 如果可能,将值转换为 int
  • 如果未设置值或值为 null,则返回默认值
  • 如果值不是 null 但无法转换,则抛出 InvalidArgumentException

intOrNull(string $key): ?int

  • 如果可能,将值转换为 int
  • 或返回 null

intOrDefault(string $key, int $default): int

  • 如果可能,将值转换为 int
  • 或返回默认值

float(string $key, float $default = 0): float

  • 如果可能,将值转换为 float
  • 如果设置值但无法转换,则抛出 InvalidArgumentException
  • 如果未设置值,则返回默认值

floatNullable(string $key, ?float $default = null): ?float

  • 如果可能,将值转换为 float
  • 如果未设置值或值为 null,则返回默认值
  • 如果值不是 null 但无法转换,则抛出 InvalidArgumentException

floatOrNull(string $key): ?float

  • 如果可能,将值转换为 float
  • 或返回 null

floatOrDefault(string $key, float $default): float

  • 如果可能,将值转换为 float
  • 或返回默认值

strings(string $key): array<int, string>

  • 如果可能,将值转换为字符串数组
  • 如果某些项无法转换,则抛出 InvalidArgumentException

stringsFiltered(string $key): array<int, string>

  • 将值转换为字符串数组,跳过无法转换的项

stringsForced(string $key, string $default = ''): array<int, string>

  • 将值转换为字符串数组,无法转换的项用默认值替换

ints(string $key): array<int, int>

  • 如果可能,将值转换为整数数组
  • 如果某些项无法转换,则抛出 InvalidArgumentException

intsFiltered(string $key): array<int, int>

  • 将值转换为整数数组,跳过无法转换的项

intsForced(string $key, int $default = ''): array<int, int>

  • 将值转换为整数数组,无法转换的项用默认值替换

floats(string $key): array<int, float>

  • 如果可能,将值转换为浮点数数组
  • 如果某些项无法转换,则抛出 InvalidArgumentException

floatsFiltered(string $key): array<int, float>

  • 将值转换为浮点数数组,跳过无法转换的项

floatsForced(string $key, float $default = ''): array<int, float>

  • 将值转换为浮点数数组,无法转换的项用默认值替换

array(string $key): SafeAssocArray

  • 将值转换为关联数组,并使用 SafeAssocArray 包装
  • 如果值无法转换,则抛出 InvalidArgumentException

list(string $key): SafeAssocList

  • 将值转换为关联数组列表,并使用 SafeAssocList 包装
  • 如果值无法转换,则抛出 InvalidArgumentException

访问器

SafeAssocArray

$user = [
    'name' => 'John',
    'age' => 18,
    'sports' => ['football', 'handball'],
];

$safe = SafeAssocArray::from($user);
$safe->string('name');             // 'John'
$safe->int('age');                 // 18

$safe->string('nickname', '--');   // '-'
$safe->stringNullable('nickname'); // NULL
$safe->string('nickname');         // InvalidArgumentException

$safe->strings('sports');          // ['football', 'handball']
$safe->ints('sports');             // InvalidArgumentException

SafeConsoleInput

final class ExampleCommand extends Command
{
    // ...
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $arguments = SafeConsoleInput::arguments($input);
        
        // require string from argument
        $file = $arguments->string('name');
    
        $options = SafeConsoleInput::options($input);
        
        // integer with default value
        $limit = $options->int('limit', 20);
        
        // optional integer value
        $pageOrNull = $options->intNullable('page');
        
        // bool
        $isDryRun = $options->bool('dry-run', false);
        
        // string[]
        $tags = $options->strings('tag');
        
        // int[]
        $tags = $options->ints('status');
    }
}

SafeRequest

final class ExampleAction extends Command
{
    // ...
    public function __invoke(Request $request): Response
    {
        $safeRequest = SafeRequest::from($request);
        $query = $safeRequest->query();
        $post = $safeReques->request();
        $attributes = $safeReques->attributes();
        
        $ip = $safeReques->ip();
        $postId = $attributes->string('postId');
        $tags = $post->strings('tags');
        // ...
    }
}