asgard / entity
Requires
- php: >=5.5.9
- asgard/common: ~0.3.0
- asgard/container: ~0.3.0
- asgard/hook: ~0.3.0
- asgard/validation: ~0.3.0
Requires (Dev)
- asgard/config: ~0.3.0
- asgard/file: ~0.3.0
- asgard/http: ~0.3.0
- nesbot/carbon: ^1.0
Suggests
- asgard/cache: ~0.3.0
- asgard/file: ~0.3.0
- asgard/http: ~0.3.0
- nesbot/carbon: ^1.0
This package is not auto-updated.
Last update: 2024-09-14 06:29:37 UTC
README
#实体
实体是代表您数据的元素。某些框架称其为模型,但它们类似,尽管实体不直接与数据库打交道。它们应始终存储在包的实体文件夹中。
##安装 如果您正在处理Asgard项目,您不需要安装此库,因为它已经是标准库的一部分。
composer require asgard/entity 0.*
实体可以如下实例化
$article = new Article;
您也可以传递默认值
$article = new Article(['title'=>'hello!']);
实体由一个类定义
<?php
class Article extends \Asgard\Entity\Entity {
public static function definition($definition) {
$definition->properties = [
'title' => [
'required'=>true
],
'content' => 'text',
'posted_on' => 'date'
]
}
}
这里我们定义了实体Article,包含3个属性:标题、内容和发布日期。标题的默认类型是 "字符串"(少于255个字符的文本),内容是 "文本" 类型,而发布日期是日期。实际上有4种不同的方式来定义属性
$definition->properties = [
'title'
]
#or
$definition->properties = [
'title' => 'string'
]
#or
$definition->properties = [
'title' => [
'type' => 'string',
...
]
]
#or
$definition->properties = [
'title' => new \Asgard\Entity\Property\StringProperty([..])
]
类型是可选的,默认为 "字符串"。目前您可以使用的类型有: "布尔值"、"日期"、"日期时间"、"双精度"、"电子邮件"、"文件"、"图片"、"整数"、"文本" 和 "字符串"。
每种类型都会影响实体中数据的存储方式、验证方式,甚至数据库中的持久化方式。
您可以通过以下方式访问实体定义
$entity->getDefinition()
实体属性可以通过这种方式访问
$article->title
#or
$article->get('title')
并且可以通过这种方式编辑
$article->title = 'hello';
$article->set('title', 'hello')
或者一次性设置多个属性
$article->set(['title'=>'hello', 'content'=>'everyone'])
'property_name' => 'boolean'
该属性只返回true|false。
日期
'property_name' => 'date'
该属性返回一个 \Carbon\Carbon 对象,但只显示日期当转换为字符串时。
日期时间
'property_name' => 'datetime
该属性返回一个 \Carbon\Carbon 对象。
双精度
'property_name' => 'double'
该属性返回一个双精度数字。
电子邮件
'property_name' => 'email'
该属性返回一个电子邮件地址,并且仅在提供了有效的电子邮件地址时才有效。pos 文件
'property_name' => [
'type' => 'file',
'web' => true
]
该属性返回一个 \Asgard\File\File 对象。
如果您想将文件作为Web资源存储,则必须将web参数设置为true。
整数
'property_name' => 'integer'
该属性返回一个整数数字。
文本
'property_name' => 'text'
该属性返回多于255个字符的文本。
字符串
'property_name'
该属性返回少于255个字符的文本。
##每个属性可存储多个值 一个属性甚至可以有多个值(数组)。为此,请添加multiple参数,如下所示
$definition->properties = [
'title' => [
'many' => true
]
]
现在,$article->title将返回一个 Asgard\Entity\ManyCollection 对象,可以像数组一样使用
$article->title[] = 'new title';
$article->title[0] //new title
您可以为每次更新属性值设置一个钩子
$definition->properties = [
'title' => [
'hooks' => [
'set' => function($value, $entity) {
if($value < 10)
$value = 10;
return $value;
}
]
]
]
返回结果将用作新的属性值。
$definition->properties = [
'title' => [
'validation' => [
'maxlength' => 10,
'minlength' => 5
]
]
]
要验证您的实体,请使用
$article->valid() #returns true of valid, otherwise false
$article->errors() #returns an array of errors
验证分组
$definition->properties = [
'title' => [
'validation' => [
'maxlength' => 10,
'minlength' => [
5,
'groups' => ['registration']
]
]
]
]
标题字符数少于5个
$article->valid(['registration']); #false
$article->valid(); #true
有关验证的更多信息,请参阅验证部分。
##行为实体可以通过行为进行增强。行为可以添加方法和属性,并使用钩子修改其当前行为。例如,要使实体可排序,将以下代码添加到定义方法中
$definition->behaviors = [
new \Asgard\Behaviors\SortableBehavior()
];
这为文章实体添加了一个属性 "position",以及两个方法:moveAfter($entity) 和 moveBefore($entity)。
您还可以向行为传递参数
$definition->behaviors = [
new \Asgard\Behaviors\SortableBehavior('category_id')
];
如果您只想在具有相同 category_id 的文章之间排序。
请注意,此行为仅与 ORMBehavior 一起使用时才能正常工作。
##国际化默认情况下,实体通过国际化处理。只需将参数 i18n 添加到属性中
$definition->properties = [
'title' => [
'i18n' => true
]
]
从现在起,标题将为配置文件中所有语言的不同版本。
获取默认语言
$article->title
获取特定语言中的值
$article->get('title', 'fr')
获取所有可用语言的值
$article->get('title', 'all')
设置值
$article->title = 'hello'
$article->set('title', 'bonjour', 'fr')
$article->set(['title'=>'bonjour', 'content'=>'tout le monde'], 'fr')
要确定实体是否具有 i18n 属性,请使用
$entityDefinition->is18N()
#or
Article::isI18N()
更改实体实例的默认语言
$entity->setLocale('fr');
获取实体的所有区域设置
$entity->getLocales();
将实体翻译成另一区域设置
$frEntity = $enEntity->translate('fr');
#$enEntity->title = 'Hello'
#$frEntity->title = 'Bonjour'
验证
$entity->validI18N(['fr', 'en'], $validationGroups=[]);
验证实体和给定区域设置的翻译。如果没有给出区域设置,默认使用所有实体区域设置。
获取错误
$entity->errorsI18N(['fr', 'en'], $validationGroups=[]);
实体可以序列化为数组或 json。
创建序列化器
$serializer = new \Asgard\Entity\Serializer;
#or
如果您使用默认序列化器,直接从实体类调用方法具有相同的效果。例如
$entity->toArrayRaw($depth=0);
等同于
$serializer->toArrayRaw($entity, $depth=0);
toArrayRaw
$serializer->toArrayRaw($entity, $depth=0);
$depth 定义了在序列化中包含多少层关系
toArrayRaw 将返回一个包含所有属性值的数组。
toArray
$serializer->toArray($entity, $depth=0);
与 toArrayRaw 的区别在于,toArray 将所有属性转换为字符串和数组,包括相关实体。
toJSON
$serializer->toJSON($entity, $depth=0);
这将返回 toArray 的 JSON 版本。
toArrayRawI18N
$serializer->toArrayRawI18N($entity, $locales=[], $depth=0);
与 toArrayRaw 相同,但包括翻译。
toArrayI18N
$serializer->toArrayI18N($entity, $locales=[], $depth=0);
与 toArrayRaw 相同,但包括翻译。
toJSONI18N
$serializer->toArrayI18N($entity, $locales=[], $depth=0);
与 toJSON 相同,但包括翻译。
arrayToJSONI18N
$serializer->arrayToJSONI18N($entities, $locales=[], $depth=0);
在实体数组上调用 toJSONI18N。
arrayToJSON
$serializer->arrayToJSON($entities, $locales=[], $depth=0);
在实体数组上调用 toJSON。
要验证实体是否为旧(持久化),请使用
$entity->isOld();
#or
$entity->isNew();
###贡献
请将所有问题和拉取请求提交到asgardphp/asgard 仓库。
许可证
Asgard 框架是开源软件,根据MIT 许可证许可。