Laravel 8.28 新增 AsArrayObject 和 AsCollection 自定义类型转换
发布日期:作者: Paul Redmond
本周发布的 Laravel 8.28 中,Taylor Otwell 添加了两种新的自定义类型转换:AsArrayObject
和 AsCollection
。ArrayObject 比现有的 JSON 和数组数据类型转换更具优势。
有关这些类型转换为 Laravel 8 带来的功能的详细说明,请查看 拉取请求说明。
当然,Laravel 已经包含将包含 JSON 的 JSON/TEXT 列转换为数组或集合的功能,如下所示:
$casts = ['options' => 'array'];
但是,这确实有一些缺点。首先,以下代码使用简单的数组类型转换是不可能的:
$user = User::find(1);$user->options['foo'] = 'bar';$user->save();
许多开发人员可能希望它能工作,但它不能。无法修改此类型转换返回的原始数组的特定属性。您必须修改整个数组。
$user = User::find(1);$user->options = ['foo' => 'bar'];$user->save();
但是,这些新的类型转换利用了 Eloquent 的自定义类型转换功能,该功能实现了更智能的对象管理和缓存。
AsArrayObject
类型转换将底层 JSON 字符串转换为 PHPArrayObject
实例。此类包含在 PHP 的标准库中,并允许对象的行为类似于数组。这种方法使得以下操作成为可能:
// Within model...$casts = ['options' => AsArrayObject::class]; // Manipulating the options...$user = User::find(1);$user->options['foo']['bar'] = 'baz';$user->save(); // You can't use ArrayObject in functions like array_map// You can cast to an array or collection from ArrayObject$user->options->toArray();$user->options->collect();
了解更多
我建议您查看 拉取请求 #36245,以了解有关实现的详细信息。阅读 PR 说明——它很好地解释了 Laravel 数组数据类型转换的当前状态以及新 ArrayObject 和 Collection 类型转换的优势。PHP 文档是了解内置 ArrayObject 类(在 PHP 5 中引入)的绝佳资源,该类允许对象像数组一样工作。