anfischer/cloner

一个允许轻松递归克隆和持久化Laravel Eloquent模型的包

v0.4.1 2022-09-22 13:28 UTC

README

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

一个允许轻松递归克隆和持久化Laravel Eloquent模型的包,包括

  • 递归克隆Eloquent模型及其关系而不强制持久化,允许在将克隆的模型保存到数据库之前对其进行内存中的更改
  • 持久化递归关系,包括克隆的关联数据

由于这是我在客户项目中经常依赖的功能,我决定将其提取到一个包中。然而,这也意味着您的使用效果可能会有所不同,因此欢迎提交pull请求 - 请参阅CONTRIBUTING以获取详细信息。

结构

src/
tests/
vendor/

版本兼容性

安装

通过Composer

$ composer require anfischer/cloner

该包将自动注册其服务提供者。

使用方法

基本用法

use Anfischer\Cloner;

$clone = (new CloneService)->clone($someEloquentModel);
$persistedModel = (new PersistenceService)->persist($clone);

or

$cloner = new Cloner(new CloneService, new PersistenceService);
$clone = $cloner->clone($someEloquentModel);
$persistedModel = $cloner->persist($clone);

or

$clone = \Cloner::clone($someEloquentModel);
$persistedModel = \Cloner::persist($clone);

便捷方法

Cloner还公开了一个同时进行克隆和持久化的便捷方法

$cloner = new Cloner(new CloneService, new PersistenceService);
$persistedModel = $cloner->cloneAndPersist($someEloquentModel);

克隆模型映射

您可能希望跟踪哪些模型被克隆及其克隆的键。为此,Cloner记录这些键。

$cloneService = new CloneService()

// $personModel->id === 1;
// gettype($personModel) === App\Person;

$clone = ($cloneService)->clone($personModel);

$persistedModel = (new PersistenceService)->persist($clone);
// or
$persistedModel = $clone->save();

// $persistedModel->id === 2

$map = $cloneService->getKeyMap();

// $map === [App\Person => [1 => 2]];

配置

要发布配置文件到config/cloner.php,请运行

php artisan vendor:publish --provider="Anfischer\Cloner\ClonerServiceProvider"

Cloner默认支持各种持久化策略。这些可以通过修改config/cloner.php中的配置来配置。

例如

return [

    'persistence_strategies' => [
        Illuminate\Database\Eloquent\Relations\HasOne::class =>
            Anfischer\Cloner\Strategies\PersistHasOneRelationStrategy::class,
        Illuminate\Database\Eloquent\Relations\HasMany::class =>
            Anfischer\Cloner\Strategies\PersistHasManyRelationStrategy::class,
        Illuminate\Database\Eloquent\Relations\BelongsToMany::class =>
            Anfischer\Cloner\Strategies\PersistBelongsToManyRelationStrategy::class,

        // You can add your own strategies for relations
        SomePackage\Relations\CustomRelation =>
            App\Cloner\PersistenceStrategies\PersistSomePackageCustomRelationStrategy
    ]
];

变更日志

有关最近更改的更多信息,请参阅CHANGELOG

测试

$ composer test

安全

如果您发现任何安全相关的问题,请通过电子邮件kontakt@season.dk联系,而不是使用问题跟踪器。

鸣谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件