proai / laravel-struct
一个用于在 Laravel 中使用结构体(structs)的 Laravel 扩展包,包括属性转换。
Requires
- php: ^8.0
- illuminate/database: ^10.0||^11.0
- illuminate/support: ^10.0||^11.0
This package is not auto-updated.
Last update: 2024-09-23 19:47:57 UTC
README
结构体是一系列类型变量的集合。结构体在其他编程语言中是一个已知的数据类型,但不幸的是,PHP 中还没有原生的结构体。这个包旨在将结构体引入 PHP,尤其是 Laravel。
安装
您可以通过 composer 安装此包
composer require proai/laravel-struct
请注意,您需要至少 PHP 7.4 和 Laravel 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; }
您可以使用所有原始类型,如 string
、bool
、float
、int
,同时也可以将属性类型化为对象。对象也可以是另一个结构体,这使得您能够嵌套结构体(如上面的 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 许可证 下发布。