makeabledk/php-value-objects

v0.15.0 2024-01-19 14:42 UTC

This package is auto-updated.

Last update: 2024-09-19 15:59:05 UTC


README

Latest Version on Packagist Build Status StyleCI

此包提供了一系列便捷的值对象

  • 持续时间
  • 周期
  • 白名单

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国际。请参阅许可证文件以获取更多信息。