makeabledk / php-value-objects
Requires
- php: ^8.1
- illuminate/support: ^10.0|^11.0
- nesbot/carbon: ^2.0
Requires (Dev)
- phpunit/phpunit: ^9.5
README
此包提供了一系列便捷的值对象
- 持续时间
- 周期
- 白名单
Makeable是一家位于丹麦奥尔胡斯的网页和移动应用代理机构。
安装
您可以通过composer安装此包
composer require makeabledk/php-value-objects
用法
持续时间
持续时间提供了一个轻松的方式来交互和操作时间的持续时间。
示例用法
创建一个持续时间并显示格式化的
Duration::create(1,30)->toFormat(); // 01:30:00
您还可以指定自定义格式。有效的占位符是:h,hh,m,mm,s,ss
Duration::$format = 'h:mm'; Duration::create(1,30)->toFormat(); // 1:30
执行简单的加减运算
Duration::create(1,30)->add(Duration::create(1,30))->toFormat(); // 03:00:00 Duration::create(1,30)->subtract(Duration::create(0,20))->toFormat(); // 01:10:00
如果您使用Laravel,并且有一个Events@getDurationAttribute()访问器,它转换为Duration::class,您甚至可以这样做
$events = Events::all(); $eventsTotalDuration = Duration::sum($events, 'duration');
轻松导出为数组,并在需要时重新实例化。非常适合提供客户端API。
$exported = Duration::create(1,30)->toArray(); // ['seconds' => 5400, 'minutes' => 90, 'hours' => 1.5, 'formatted' => '01:30:00'] $imported = Duration::fromArray($exported);
*注意它实现了illuminate/support Arrayable接口,因此它自动将eloquent模型转换为数组。
周期
Period对象非常适合您需要在给定周期内查询数据时。
示例用法
创建一个周期。请注意,起始和结束都是可选的。
$today = new Period(Carbon::today(), Carbon::tomorrow()); $future = new Period(Carbon::now()); $past = new Period(null, Carbon::now());
动态操作
$thisWeek = new Period( Carbon::today()->previous(Carbon::MONDAY) Carbon::today()->next(Carbon::SUNDAY) ); $thisWeek->earliest(Carbon::today())->getStart(); // carbon of today $thisWeek->latest(Carbon::tomorrow())->getEnd(); // carbon of tomorrow
轻松导出为数组,并在需要时重新实例化。非常适合提供客户端API。
$exported = (new Period(Carbon::today(), Carbon::tomorrow()))->toArray(); // ['start' => '2017-06-27 00:00:00', 'end' => '2017-06-28 00:00:00'] $imported = Duration::fromArray($exported);
*注意它实现了illuminate/support Arrayable接口,因此它自动将eloquent模型转换为数组。
白名单
白名单是一个抽象类,您可以通过它扩展来指定一组白名单值。
它非常适合快速创建一个确保您始终使用有效状态的Status对象。
示例用法
创建一个OrderStatus类
class OrderStatus extends Whitelist { const VALUES = ['pending', 'accepted', 'cancelled']; }
现在您只能使用有效的状态实例化OrderStatus
$accepted = new OrderStatus('accepted'); $invalid = new OrderStatus('foobar'); // throws exception
您可以自定义抛出的异常。例如,您可以用默认的Symfony/Laravel '422 UnprocessableEntityExceptions'来替换它。
OrderStatus::$exceptionClass = \Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException::class;
现在您为表单和通配符控制器方法(例如,'/orders/{status}')提供了开箱即用的错误处理!
变更日志
请参阅CHANGELOG以获取有关最近更改的更多信息。
测试
您可以使用以下命令运行测试
composer test
贡献
我们很高兴接受具有额外功能的拉取请求。请参阅CONTRIBUTING以获取详细信息。
鸣谢
许可证
署名-相同4.0国际。请参阅许可证文件以获取更多信息。