somnambulist / laravel-doctrine-behaviours
Requires
- php: >=5.5.9
- laravel-doctrine/orm: 1.*
- nesbot/carbon: ~1.19
- ramsey/uuid: ~3.0
Requires (Dev)
- illuminate/config: ~5.2
- mikey179/vfsstream: ~1.6
- phpunit/phpunit: ~5.4
README
此项目已被通用域库取代,该库将多个包合并为一个,以便更容易维护。请注意,许多这些行为已被完全删除。
Laravel-Doctrine ORM的行为
添加了一些非常常见的特质、契约和事件订阅者,这些可以在Laravel-Doctrine ORM包中使用,取代了Gedmo Blameable和Timestampable,以及UUID预持久化行为。
该库在命名和Doctrine配置方面非常有意见。每个行为和所有特质都基于Doctrine使用配置文件而不是注解运行。每个字段的名称在特质中设置。
要求
- PHP 7+
- laravel 5.3+
- laravel-doctrine/orm
BC Breaks
1.0.0
此包的早期版本包含Sluggable和Uuid监听器,但这些已被删除,因为UUID和slug应该在持久化/刷新实体之前由应用程序生成。
此外,许多接口已重新定义或完全删除了设置器的需求,因为许多属性更改应通过受控状态转换进行。例如:时间戳应初始化且createdAt不可修改;blamable应设置创建者但不允许修改,UUID在事后不应更改。
变更的完整列表如下
- Blamable ** 删除了setCreatedBy、setUpdatedBy ** 添加了blameCreator()、blameUpdater() ** 特质实现接口且blameCreator()不允许更改
- NumericallySortable ** 删除了setOrdinal ** 添加了updateSortingOrder()
- Publishable ** 删除了setPublishedAt ** 特质更新为删除setPublishedAt()方法
- Sluggable ** 删除了setSlug ** 删除了SluggableEventSubscriber
- Timestampable ** 删除了setCreatedAt、setUpdatedAt ** 添加了initializeTimestamps()、updateTimestamps() ** 特质实现接口且initializeTimestamps()不会重置日期
- UniversallyIdentifiable ** 删除了setUuid ** 删除了UuidEventSubscriber
- Versionable ** 删除了setVersion ** 将特质的初始值更改为0 ** incrementVersion现在在prePersist和preUpdate上调用
对于slug和UUID等唯一标识符,应在首次创建实体时生成并在创建时传递。
安装
使用composer安装,或从github.com检查/提取文件。
- composer install somnambulist/laravel-doctrine-behaviours
在Doctrine中启用
要启用行为,请将每个EventSubscriber添加到config/doctrine.php文件中
'managers' => [
'default' => [
'events' => [
'subscribers' => [
\Somnambulist\Doctrine\EventSubscribers\BlamableEventSubscriber::class,
\Somnambulist\Doctrine\EventSubscribers\TimestampableEventSubscriber::class,
\Somnambulist\Doctrine\EventSubscribers\VersionableEventSubscriber::class,
]
],
]
],
- 注意:您只需要添加您希望使用的订阅者。
为确保在实体中使用 Carbon,并对以下类型进行以下操作
'custom_types' => [
'date' => \Somnambulist\Doctrine\Types\DateType::class,
'datetime' => \Somnambulist\Doctrine\Types\DateTimeType::class,
'datetimetz' => \Somnambulist\Doctrine\Types\DateTimeTzType::class,
'time' => \Somnambulist\Doctrine\Types\TimeType::class,
],
- 注意:使用 TimestampableEventSubscriber 时需要类型覆盖。
- 注意:这些行为旨在与元数据文件一起使用,而不是注解!
JsonCollection
要启用 JsonCollectionType,请将以下内容添加到 doctrine.php 中的 custom_types
'json_collection' => \Somnambulist\Doctrine\Types\JsonCollectionType::class,
此类型将 JSON 编码的字符串转换为 ArrayCollection 对象,而不是标准的 PHP 数组。根据使用情况,这可能更有用,并允许在您的实体中保持一致的集合处理。
要使用 JsonCollection,在映射文件中将类型设置为:json_collection
// simple example
Entity:
fields:
properties:
type: json_collection
然后在实体构造函数中初始化该属性。
- 注意:如果 JSON 数据为空,则使用空的 ArrayCollection。
- 注意:这不会替换标准的 json_array;您可以使用两者。
服务提供者
包含一个 Laravel 服务提供者,允许在配置文件中定义仓库。将服务提供者添加到您的 main app.php 中 - 在 DoctrineServiceProvider 之后。
\Somnambulist\Doctrine\Providers\BehavioursServiceProvider::class,
发布供应商信息,并将添加两个新的配置文件
- config/doctrine_behaviours.php
- config/doctrine_repositories.php
行为包含用于 make:entity
控制台命令的设置,该命令可以更容易地添加新实体和仓库。
仓库允许您配置仓库,以便它们可以被依赖注入容器类型提示和解析(自动装配)。
以下选项是必需的
- repository - 仓库类,可以是 EntityRepository::class
- entity - 仓库所对应的实体类名
以下为可选
- alias - 一个较短的别名,例如 app.user.repository
- tags - 要添加到容器中的引用的任何标签,例如
[ 'repository' ]
- em - 管理此实体的替代实体管理器,例如 'my_manager'
行为/特质
Blamable
Blamable 添加了 createdBy 和 updatedBy,然后尝试设置执行创建/更新的用户名称。这来自 auth()->user() 对象。将依次检查 User 对象
- UUID (UuidContract / getUuid)
- 用户名 (getUsername)
- 电子邮件 (getEmail)
- Id (getId)
如果用户(某种方式)没有实现上述任何一项,则将类和标识符提取出来,并尝试从 Doctrine 仓库中找到,然后在找到的实体上再次进行相同的检查。
如果没有用户,将应用默认值:'system'
这可以通过设置环境变量来覆盖:DOCTRINE_BLAMABLE_DEFAULT_USER。
要添加 Blamable 支持,请确保您的实体实现了 Blamable 协议。提供了一个特质,该特质添加了适当的方法
use Somnambulist\Doctrine\Contracts\Blamable as BlamableContract;
use Somnambulist\Doctrine\Traits\Blamable;
class MyEntity implements BlamableContract
{
use Blamable;
}
务必更新您的映射文件以包括字段
fields:
createdBy:
type: string
length: 36
updatedBy:
type: string
length: 36
这些字段应至少为 36 个字符长,因为可能使用 UUID。
Sluggable
Sluggable 添加了 getSlug,即名称的 URL 友好文本表示。包含一个实现该属性和方法的特质。
示例用法
use Somnambulist\Doctrine\Contracts\Sluggable as SluggableContract;
use Somnambulist\Doctrine\Traits\Sluggable;
class MyEntity implements SluggableContract
{
use Sluggable;
}
映射文件字段
fields:
slug:
type: string
length: 255
由于 slug 应该是唯一的,因此您应该在应用程序代码中生成它们。
注意:由于 slug 应该是唯一的,因此您的应用程序代码应该生成它们。
Timestampable
Timestampable 添加了 createdAt 和 updatedAt 字段以及持久化功能到您的实体中。这个扩展内部使用 Carbon(就像 Laravel 的 Eloquent)。由于这些字段将由事件订阅者自动设置,因此不需要手动填充这些字段。由于内部使用 Carbon,因此必须在 config/doctrine.php 文件中添加类型映射。
要添加 timestampable,实现该合约并可选地包含该特性
use Somnambulist\Doctrine\Contracts\Timestampable as TimestampableContract;
use Somnambulist\Doctrine\Traits\Timestampable;
class MyEntity implements TimestampableContract
{
use Timestampable;
}
然后在您的实体映射文件中添加以下内容
fields:
createdAt:
type: datetime
updatedAt:
type: datetime
现在您的实体将标记有它们创建/更新的日期和时间。
注意:默认时区被使用。在开始使用之前,请确保已设置。建议将 PHP 默认时区设置为 UTC,然后在 UI 中进行转换。
通用标识
UniversallyIdentifiable 为您的实体添加了一个 UUID 字段。
UUID 应由适当的 uuid 库生成(例如:ramsey/uuid)。建议使用 UUIDv4 随机标识符,除非您需要为相同的初始值重新生成 UUID。
像使用 UniversallyIdentifiable 的其他行为一样,实现合约并可选使用特性
use Somnambulist\Doctrine\Contracts\UniversallyIdentifiable as UniversallyIdentifiableContract;
use Somnambulist\Doctrine\Traits\UniversallyIdentifiable;
class MyEntity implements UniversallyIdentifiableContract
{
use UniversallyIdentifiable;
}
这将确保该实体在任何系统中都具有唯一的可识别性——在将实体公开到 API 中时非常有用。
请确保将 UUID 字段定义添加到您的实体映射文件中
uniqueConstraints:
uniq_table_name_here_uuid:
columns: [ uuid ]
fields:
uuid:
type: guid
添加到 UUID 字段的唯一约束是个不错的选择。
注意:使用 UUID 时,请确保在实体的构造函数中满足这一要求。
附加信息:您可能希望使用 ramsey/uuid-doctrine
,这样 UUID 总是作为对象进行填充。在这种情况下,将类型设置为 "uuid",并确保您的实体使用 UuidInterface
作为类型提示。
版本控制
Versionable 添加了一个简单的 "版本" 属性,每次更新时都会递增。特性将默认(未持久化)值设置为 0(零),并在 prePersist 中将其提升到 1(一)。
请确保将以下内容添加到您的映射文件中
fields:
version:
type: integer
监听器将在每次实体更新时递增版本。
其他
除了主要行为外,还有几个附加合约/特性
- Identifiable - 添加 id / getId
- Nameable - 添加 name / getName
- NumericallySortable - 添加 ordinal / getOrdinal / updateSortingOrder
- Publishable - 添加 publishedAt / getPublishedAt / isPublished / publishAt / unPublish
- IdentifiableWithTimestamps - Identifiable, Timestampable
- Trackable - Identifiable, Nameable, Blamable, Timestampable
- GloballyTrackable - Identifiable, Nameable, Blamable, Timestampable, UniversallyIdentifiable
NumericallySortable 添加了一个简单的 "ordinal" 字段,允许记录通过递增的整数值进行排序。这需要在您的实体中手动跟踪,例如:在向集合添加/删除时,添加一个 "renumber" 方法调用,这将迭代并重新编号集合中的项目。包含了一个简单的 CanRenumberCollection 接口/特性,但您可能需要更复杂的东西。
Trackable / GloballyTrackable 将其他特性/合约封装起来,提供了一个方便的方法来添加所有内容,无论是作为内部实体(Trackable)还是可能面向外部的实体(GloballyTrackable)。
MakeEntityCommand
已添加一个辅助命令,用于快速生成实体存根、存储库和存储库接口。此命令假定您的应用程序文件夹结构将遵循以下模式
- app/Contracts/*
- app/Repositories/*
- app/Support/*
实体类将在类名被设置的任何地方创建,例如:App\Entities\MyEntity 将在 app/Entities 目录下创建。如果你的基本命名空间是例如:SomeProject\SomeModule,且实体名是 SomeProject\SomeModule\Entities\MyEntity,则路径将是:app/Entities。
如果尚未存在,该命令将创建 AppEntityRepository。
要使用此命令,将其添加到你的 Console/Kernel.php 文件中的命令列表中。然后你可以通过以下方式调用它:
php artisan make:entity 'App\Entities\MyEntity'
可选地,你可以添加各种选项来添加行为
php artisan make:entity 'App\Entities\MyEntity' -tps
将使实体可追踪(Trackable)、可发布(Publishable)和可生成短链接(Sluggable)。并非所有选项都可以同时使用。如果你选择了不兼容的选项集,你将收到一个错误。
此命令可以被扩展以添加其他选项。简单重写 behaviourOptionMappings