目录
Meta数据类型
您可以将多种不同类型的值附加到Metable模型。 Royalcms-Mediable支持的数据类型开箱即用。
标量值
支持以下标量值。
Array
标量值数组。 支持嵌套数组。
<?php
$metable->setMeta('information', [
'address' => [
'street' => '123 Somewhere Ave.',
'city' => 'Somewhereville',
'country' => 'Somewhereland',
'postal' => '123456',
],
'contact' => [
'phone' => '555-555-5555',
'email' => 'email@example.com'
]
]);
警告
Royalcms-Metable在引擎盖下使用json_encode()和json_decode()进行数组序列化。 这将导致嵌套在数组中的任何对象都被强制转换为数组。
Boolean
<?php
$metable->setMeta('accepted_promotion', true);
Integer
<?php
$metable->setMeta('likes', 9001);
Float
<?php
$metable->setMeta('precision', 0.755);
Null
<?php
$metable->setMeta('linked_model', null);
String
<?php
$metable->setMeta('attachment', '/var/www/html/public/attachment.pdf');
对象值
支持以下类和接口。
Eloquent Models
可以将另一个Eloquent模型附加到Metable模型。
<?php
$page = App\Page::where(['title' => 'Welcome'])->first();
$metable->setMeta('linked_model', $page);
当调用$metable->getMeta()时,将从数据库重新加载附加的模型。
还可以附加尚未保存到数据库的Model实例。
<?php
$metable->setMeta('related', new App\Page);
当调用$metable->getMeta()时,将创建该类的新实例(不包括任何属性)。
Eloquent Collections
类似地,通过提供包含模型的Royalcms\Component\Database\Eloquent\Collection实例,可以将多个模型附加到键。
与单个模型一样,可以存储现有和未保存的实例。
<?php
$users = App\User::where(['title' => 'developer'])->get();
$metable->setMeta('authorized', $users);
DateTime & Carbon
实现DateTimeInterface的任何对象。 对象将转换为Carbon实例。
<?php
$metable->setMeta('last_viewed', \Carbon\Carbon::now());
Serializable
任何实现PHP Serializable接口的对象。
<?php
class Example implements \Serializable
{
//...
}
$serializable = new Example;
$metable->setMeta('example', $serializable);
Plain Objects
任何其他对象都将转换为stdClass普通对象。 您可以通过在存储对象的类上实现JsonSerializable接口来控制存储的属性。
<?php
$metable->setMeta('weight', new Weight(10, 'kg'));
$weight = $metable->getMeta('weight') // stdClass($amount = 10; $unit => 'kg');
备注
Royalcms\Component\Metable\DataType\ObjectHandler类应该始终是config/metable.php数据类型数组的最后一个条目,因为它将接受任何对象,导致其下面的任何处理程序被忽略。
警告
Royalcms-Metable在引擎盖下使用json_encode()和json_decode()进行普通对象序列化。 这将导致对象属性中的任何数组转换为stdClass对象。
添加自定义的数据类型
您可以通过为类创建新的Handler来添加对其他数据类型的支持,这可以处理序列化。 只应处理可以转换为字符串然后从该字符串重建的对象。
定义一个实现Royalcms\Component\Metable\DataType\Handler接口的类,并将其注册到config/metable.php中的’datatypes’数组。 数组中处理程序的顺序很重要,因为Royalcms-Metable将遍历它们并使用第一个为给定值的canHandleValue()方法返回true的条目。 确保在更抽象的类之前有更多具体的类。