asgard/entity

维护者

详细信息

github.com/asgardphp/entity

源代码

v0.3.1 2016-05-13 11:31 UTC

This package is not auto-updated.

Last update: 2024-09-14 06:29:37 UTC


README

#实体

Build Status

实体是代表您数据的元素。某些框架称其为模型,但它们类似,尽管实体不直接与数据库打交道。它们应始终存储在包的实体文件夹中。

##安装 如果您正在处理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 许可证许可。