proai/laravel-struct

一个用于在 Laravel 中使用结构体(structs)的 Laravel 扩展包,包括属性转换。

v0.1.6 2024-08-26 19:26 UTC

This package is not auto-updated.

Last update: 2024-09-23 19:47:57 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License

结构体是一系列类型变量的集合。结构体在其他编程语言中是一个已知的数据类型,但不幸的是,PHP 中还没有原生的结构体。这个包旨在将结构体引入 PHP,尤其是 Laravel。

安装

您可以通过 composer 安装此包

composer require proai/laravel-struct

请注意,您需要至少 PHP 7.4Laravel 8 才能使用此包。

用法

该包使用 PHP 7.4 中引入的命名属性来定义结构体

use App\Structs\GeoLocation;
use ProAI\Struct\Struct;

class Address extends Struct
{
    public string $street;

    public string $city;

    public GeoLocation $geo_location;
}

您可以使用所有原始类型,如 stringboolfloatint,同时也可以将属性类型化为对象。对象也可以是另一个结构体,这使得您能够嵌套结构体(如上面的 GeoLocation)。

结构体通过使用值数组来实例化

$address = new Address([
    'street' => 'Baker Street',
    'city' => 'London',
    'geo_location' => [
        'latitude' => 51.52,
        'longitude' => -0.1566,
    ],
]);

类型化为对象的属性将在实例化时转换为这些对象。因此,在上面的例子中,将为 $geo_location 属性创建一个 App\Structs\GeoLocation 对象。

属性可以正常访问

$address->street
=> "Baker Street"

$address->country
=> App\Structs\GeoLocation { ... }

提示:使用蛇形小写的属性名来模仿 Eloquent 属性的行为。

属性转换

您可以在 Eloquent 模型中使用结构体进行属性转换

use App\Structs\Address;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $casts = [
        'address' => Address::class,
    ];
}

为了使此功能生效,您需要定义一个指定键的 json 列,在这种情况下为 address

或者,您可以使用组合结构体转换器,通过添加参数 composed 来从多个列组合一个结构体

use App\Structs\Address;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $casts = [
        'address' => Address::class.':composed',
    ];
}

列名必须以指定的键开头,后面跟一个下划线和属性名。这也适用于嵌套结构体。对于上面的例子,我们需要以下列

address_street
address_city
address_geo_location_latitude
address_geo_location_longitude

最后,您也可以通过覆盖结构体的 castUsing 方法来编写自己的自定义转换器,就像 Laravel 文档中描述的那样。

集合

有时您需要一个结构体的数组。为此,您可以定义一个结构体集合。结构体集合类继承自 Laravel 集合类,因此您可以使用 Laravel 集合的所有方法。

use App\Structs\Address;
use ProAI\Struct\Collection;

class AddressCollection extends Collection
{
    public $type = Address::class;
}

顺便说一句,属性转换也适用于结构体集合的 json 列。

支持

错误和功能请求在 GitHub 上跟踪。

许可证

此包在 MIT 许可证 下发布。