• Stars
    star
    458
  • Rank 95,283 (Top 2 %)
  • Language
    PHP
  • License
    MIT License
  • Created about 9 years ago
  • Updated 7 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A trait for Laravel Eloquent models that lets you clone a model and it's relationships, including files. Even to another database.

Cloner

Packagist Build Status Coverage Status

A trait for Laravel Eloquent models that lets you clone a model and it's relationships, including files. Even to another database.

Installation

To get started with Cloner, use Composer to add the package to your project's dependencies:

composer require bkwld/cloner

Note: The Below step is optional in Laravel 5.5 or above!

After installing the cloner package, register the service provider.

Bkwld\Cloner\ServiceProvider::class,

in your config/app.php configuration file:

'providers' => [
    /*
    * Package Service Providers...
    */
    Bkwld\Cloner\ServiceProvider::class,
],

Usage

Your model should now look like this:

class Article extends Eloquent {

   use \Bkwld\Cloner\Cloneable;
}

You can clone an Article model like so:

$clone = Article::first()->duplicate();

In this example, $clone is a new Article that has been saved to the database. To clone to a different database:

$clone = Article::first()->duplicateTo('production');

Where production is the connection name of a different Laravel database connection.

Cloning Relationships

Lets say your Article has many Photos (a one to many relationship) and can have more than one Authors (a many to many relationship). Now, your Article model should look like this:

class Article extends Eloquent {
   use \Bkwld\Cloner\Cloneable;

   protected $cloneable_relations = ['photos', 'authors'];

   public function photos() {
       return $this->hasMany('Photo');
   }

   public function authors() {
        return $this->belongsToMany('Author');
   }
}

The $cloneable_relations informs the Cloneable as to which relations it should follow when cloning. Now when you call Article::first()->duplicate(), all of the Photo rows of the original will be copied and associated with the new Article. And new pivot rows will be created associating the new Article with the Authors of the original (because it is a many to many relationship, no new Author rows are created). Furthermore, if the Photo model has many of some other model, you can specify $cloneable_relations in its class and Cloner will continue replicating them as well.

Note: Many to many relationships will not be cloned to a different database because the related instance may not exist in the other database or could have a different primary key.

Customizing the cloned attributes

By default, Cloner does not copy the id (or whatever you've defined as the key for the model) field; it assumes a new value will be auto-incremented. It also does not copy the created_at or updated_at. You can add additional attributes to ignore as follows:

class Photo extends Eloquent {
   use \Bkwld\Cloner\Cloneable;

   protected $clone_exempt_attributes = ['uid', 'source'];

   public function article() {
        return $this->belongsTo('Article');
   }

   public function onCloning($src, $child = null) {
        $this->uid = str_random();
        if($child) echo 'This was cloned as a relation!';
        echo 'The original key is: '.$src->getKey();
   }
}

The $clone_exempt_attributes adds to the defaults. If you want to replace the defaults altogether, override the trait's getCloneExemptAttributes() method and return an array.

Also, note the onCloning() method in the example. It is being used to make sure a unique column stays unique. The Cloneable trait adds to no-op callbacks that get called immediately before a model is saved during a duplication and immediately after: onCloning() and onCloned(). The $child parameter allows you to customize the behavior based on if it's being cloned as a relation or direct.

In addition, Cloner fires the following Laravel events during cloning:

  • cloner::cloning: ModelClass
  • cloner::cloned: ModelClass

ModelClass is the classpath of the model being cloned. The event payload contains the clone and the original model instances.

Cloning files

If your model references files saved disk, you'll probably want to duplicate those files and update the references. Otherwise, if the clone is deleted and it cascades delets, you will delete files referenced by your original model. Cloner allows you to specify a file attachment adapter and ships with support for Bkwld\Upchuck. Here's some example usage:

class Photo extends Eloquent {
   use \Bkwld\Cloner\Cloneable;

   protected $cloneable_file_attributes = ['image'];

   public function article() {
        return $this->belongsTo('Article');
   }
}

The $cloneable_file_attributes property is used by the Cloneable trait to identify which columns contain files. Their values are passed to the attachment adapter, which is responsible for duplicating the files and returning the path to the new file.

If you don't use Bkwld\Upchuck you can write your own implementation of the Bkwld\Cloner\AttachmentAdapter trait and wrap it in a Laravel IoC container named 'cloner.attachment-adapter'. For instance, put this in your app/start/global.php:

App::singleton('cloner.attachment-adapter', function($app) {
   return new CustomAttachmentAdapter;
});

More Repositories

1

croppa

Image thumbnail creation through specially formatted URLs for Laravel.
PHP
492
star
2

decoy

A Laravel model-based CMS
PHP
303
star
3

tram

Cross-browser CSS3 transitions in JavaScript.
JavaScript
183
star
4

laravel-pug

Pug view adapter for Laravel and Lumen
PHP
159
star
5

vue-ssr-carousel

A performance focused Vue carousel designed for SSR/SSG environments.
JavaScript
131
star
6

vue-in-viewport-directive

Vue 2 directive that adds css classes when the element is the viewport
JavaScript
120
star
7

vue-in-viewport-mixin

Vue 2 mixin to determine when a DOM element is visible in the client window
JavaScript
102
star
8

vue-visual

Vue 2 image and video loader supporting lazy loading, background videos, fixed aspect ratios, low rez poster images, transitions, loaders, slotted content and more.
JavaScript
59
star
9

laravel-haml

Wraps MtHaml for ease use in Laravel
PHP
45
star
10

reporter

Generate styled logs of Laravel requests that include application timing, memory usage, input data, and sql queries
PHP
30
star
11

nuxt-stylus-resources-loader

Stylus resources (e.g. variables, mixins etc.) module for NuxtJs
JavaScript
25
star
12

upchuck

A simple, automatic handler of file uploads for Laravel's Eloquent models using using Flysystem.
PHP
22
star
13

body-scroll-toggle

Enables / disables scroll on the body
JavaScript
19
star
14

vue-height-tween-transition

Tween the height of the parent of transitioning items for use in accordions or carousels.
JavaScript
16
star
15

nuxt-spa-store-init

A simple Nuxt module that will hydrate the VueX store when running in SPA mode (not SSR)
JavaScript
15
star
16

scrapey

Get info about a URL such as you get when sharing a link on Facebook.
PHP
11
star
17

shopify-gtm-instrumentor

Helpers for sending standardized dataLayer events from a Shopify site, inspired by GA Enhanced Ecommerce.
JavaScript
11
star
18

freezer

Using Laravel, creates cached versions of full pages that can be served directly by Apache
PHP
9
star
19

nuxt-coffeescript-module

Adds Coffeescript support to your Nuxt app
JavaScript
8
star
20

vue-balance-text

A Vue directive that implements the "balance-text" package to create line breaks to make each line of text in an element equal.
JavaScript
8
star
21

vue-hamburger

A hamburger icon that transitions to a close icon
JavaScript
7
star
22

data-layer-events

Push clean events onto Google Tag Manager's dataLayer
JavaScript
7
star
23

php-library

PHP utility classes
PHP
7
star
24

stylus-library

Stylus utility mixins
Stylus
7
star
25

vue-tween-number

A Vue component that tweens a number value.
JavaScript
6
star
26

bukwild-contentful-utils

Utilities for interacting with Contentful, designed with Vue and Nuxt in mind.
JavaScript
5
star
27

lightkeeper

Averages multiple successive Lighthouse tests to arrive at a more accurate PageSpeed score
JavaScript
5
star
28

nuxt-page-transition-and-anchor-handler

Scroll to top before page transition, handle anchor links, and cross-dissolve between pages
JavaScript
4
star
29

sass-to-stylus

Script to convert a project's sass files to stylus
CoffeeScript
4
star
30

codebasehq

Tools for integrating Laravel apps with CodebaseHQ features
PHP
4
star
31

cloak

Opinionated Nuxt + Craft boilerplate
CoffeeScript
4
star
32

contentful-color-selector

A UI Extension for Contentful that generate a dropdown for selecting a space-wide color
HTML
4
star
33

vue-embed

Parse html from the CMS for use with statically generated sites
JavaScript
3
star
34

vue-in-view

Vue component for triggering animations, adding classes, firing events, and syncing slot variables based on visibility in the viewport.
JavaScript
3
star
35

sass-library

Sass utility mixins
CSS
3
star
36

create-cloak-app

Sets up a new Cloak (Nuxt + Craft/Contentful) based project.
CoffeeScript
3
star
37

vue-routing-anchor-parser

A Vue directive that parses child elements for internally linking anchor tags and binds their click events to use Vue Router's push().
JavaScript
3
star
38

buk-builder

NodeJS-based asset versioning, RequireJS build tool.
JavaScript
2
star
39

following-circles

Generative art demo using Backbone
JavaScript
2
star
40

katamari

Convert distances into terms that are more easily visualized
JavaScript
2
star
41

auto-publish

Automatically publish all Laravel workbench assets on every request
PHP
2
star
42

vscode-config

For collaborating on shared VS Code configuration.
2
star
43

asana-gitlab-bridge

Opinionated, self-hosted tool that keeps GitLab in sync with Asana
CoffeeScript
2
star
44

craft-webhook-scheduler

A Craft plugin that triggers webhooks when scheduled posts become active.
PHP
2
star
45

benchpress

Wordpress boilerplate
PHP
2
star
46

vue-unorphan

A Vue directive that implements the "unorphan" package to prevent line breaks between the last two words of an element.
JavaScript
2
star
47

craft-netlify-deploy-status

A Craft plugin that shows Netlify deploy statuses.
PHP
2
star
48

vue-detachable-header

Vue component that wraps your header and renders at the top of the viewport when scrolling up.
JavaScript
2
star
49

vue-modal

A component that renders a modal window with slotted content. Includes trapped tabbing for ADA compliance
JavaScript
1
star
50

cloak-i18n

Localization conventions for Cloak + Craft.
JavaScript
1
star
51

cloak-boilerplate

Modules that setup standard Cloak conventions.
JavaScript
1
star
52

js-library

JS utility modules
JavaScript
1
star
53

jquery-backbone-views

jQuery plugin for instantiating Backbone views from selected elements
JavaScript
1
star
54

nuxt-remote-asset-cache

Store remote assets in the local build during Nuxt generation
CoffeeScript
1
star
55

photoshop-actions

Photoshop actions we use
1
star
56

window-event-mediator

Mediator pattern for window event handling
JavaScript
1
star
57

filestack-test

Testing connecting to Filestack
PHP
1
star
58

cloak-sandbox

A simplified Cloak app for demos and experiments.
Stylus
1
star
59

vue-cover-video-component

Vue component for dynamically loading single-page HTML 5 videos
Vue
1
star
60

light-or-dark

Return whether a hex or rgb color is light or dark
JavaScript
1
star
61

react-visual

Renders images and videos into a container.
TypeScript
1
star
62

sitemap-from-routes

Generate a sitemap directly from your Laravel routes/web.php.
PHP
1
star
63

cloak-algolia

Nuxt module for syncing records to Algolia and bootstrapping Instantsearch.js
JavaScript
1
star
64

vue-media-loader-directive

Vue Directive preloads media depending on pixel density and viewport size
CoffeeScript
1
star