somnambulist/laravel-doctrine-behaviours

该包已被废弃,不再维护。作者建议使用somnambulist/domain包。

为laravel-doctrine扩展提供的替代Doctrine行为。提供可追责、可时间戳和通用可识别。

0.5.2 2017-02-04 03:49 UTC

This package is auto-updated.

Last update: 2022-02-01 14:17:20 UTC


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

链接