joelbutcher / php-optional
PHP中Java的Optional类的有见地实现。
v1.0.0
2022-12-02 12:09 UTC
Requires
- php: ^8.0.2
- azjezz/psl: ^1.9|^2.1
- vimeo/psalm: ^4.30
Requires (Dev)
- laravel/pint: ^1.2
- pestphp/pest: ^1.22
- phpstan/phpstan: ^1.9
README
介绍
本包受Java的Optional类启发,旨在提供一套全面的API来处理可选字段值。
示例
您可以使用Optional
类以多种方式,以下是一些示例
更新用户资料
下面的类展示了如何使用本包来更新用户的资料信息。所有字段都是可选的,因为用户可能不想更新所有字段。
<?php namespace App\DataObjects; use JoelButcher\PhpOptional\Optional; use Psl\Type; use Webmozart\Assert\Assert; class UpdateProfile { public function __construct( private readonly int $id private readonly Optional $name private readonly Optional $email private readonly Options $bio ) { // } public static function fromFormRequest(int $id UpdateProfileRequest $request): self { return new self( id: $id, name: Optional::forNullable($request->get('name')), email: Optional::forNullable($request->get('email')), bio: Optional::forNullable($request->get('bio')), ); } public static function fromArray(array $data): self { Assert::keyExists($post, 'id'); Assert::positiveInteger($post['id']); return new self( id: $data['id'], name: Optional::forOptionalArrayKey($data, 'name', Type\non_empty_string()), email: Optional::forOptionalArrayKey($data, 'email', Type\non_empty_string()), bio: Optional::forOptionalArrayKey($data, 'bio', Type\non_empty_string()), ); } public function handle(UserRepository $users): void { $user = $users->findOneById($this->id); // These callbacks are only called if the value for each optional field is present. $this->name->apply(fn (string $name) => $user->updateName($name)); $this->email->apply(fn (string $email) => $user->updateEmail($email)); $this->bio->apply(fn (string $bio) => $user->updateBio($bio)); $users->save($user); } }
注意到了\Psl\Type\non_empty_string()
调用吗?这是一个来自azjezz/psl
的抽象,它允许在运行时和静态分析级别声明类型。我们用它来解析输入为有效值,或者在输入格式不正确时引发崩溃。
azjezz/psl
和Psl\Type
工具提供了类型安全和运行时验证,通过隐式验证我们的值来实现。
OptionalField::forPossiblyMissingArrayKey( ['foo' => 'bar'], 'foo', \Psl\Type\positive_int() ); // crashes: `foo` does not contain a `positive-int`!