Laravel pakke til rekursiv kopiering og lagring af Eloquent modeller og deres relationer
Jeg har publiceret en pakke til rekursiv kloning/kopiering og lagring af Laravel Eloquent models og deres relationer.
Pakken er tilgængelig via composer (anfischer/cloner på Packagist), og pakkens kildekode er tilgængelig på Github (anfischer/cloner på Github).
Da jeg ofte har haft brug for denne feature i kundeprojekter, og det ikke i sig selv er fuldstændig trivielt at implementere rekursiv kloning af Eloquent models, blev jeg enig med mig selv om, at det var på tide at pakke funktionaliteten så det både er let for mig selv at genbruge kodebasen fremover, ligesom andre udviklere kan få gavn af den.
Pakken kan benyttes både uden, og via, en Laravel Facade. Da jeg ikke er tilhænger af Laravel Facades/Proxies, benytter jeg selv pakken uden - som illustreret i de første to eksempel nedenfor.
use Anfischer/Cloner;
$clone = (new CloneService)->clone($someEloquentModel);
//
// Do something with the clone before persisting it
//
$persistedModel = (new PersistenceService)->persist($clone);
Pakken kan også bruges direkte igennem Cloner-manager.
use Anfischer/Cloner;
$cloner = new Cloner(new CloneService, new PersistenceService);
$clone = $cloner->clone($someEloquentModel);
//
// Do something with the clone before persisting it
//
$persistedModel = $cloner->persist($clone);
... Eller via Laravel Facade.
$clone = \Cloner::clone($someEloquentModel);
//
// Do something with the clone before persisting it
//
$persistedModel = \Cloner::persist($clone);
Hvis der ikke er brug for at ændre klonet data før det gemmes til databasen, kan metoden cloneAndPersist
med fordel benyttes.
$cloner = new Cloner(new CloneService, new PersistenceService);
$persistedModel = $cloner->cloneAndPersist($someEloquentModel);
... Eller via Laravel Facade.
$persistedModel = \Cloner::cloneAndPersist($someEloquentModel);
Pakken har fuld testdækning for mine egne use-cases, men der er ikke skrevet feature tests på alle former for Eloquent-relationer. Pull requests med øget testdækning er velkomne.