nekodev/drafty

Create draft for your models in Laravel

v1.0.1 2020-07-28 19:22 UTC

This package is auto-updated.

Last update: 2024-09-29 05:55:44 UTC


README

See the complete documentation on nekodev packages website. (Comming soon)

Compatiable with Spatie/MediaLibrary package v8.

Quick Start

Installation

install package via composer

composer require nekodev/drafty

Add provider from config/app.php

'providers' => [
    ...
    Nekodev\Drafty\DraftyServiceProvider::class,
    ...
],

Launch migrations

php artisan migrate

This command will create drafts table from your database. This table will manage all your drafts data.

Prepare your model

namespace App;

use Illuminate\Database\Eloquent\Model;
use Nekodev\Drafty\Traits\Draftable;
use Nekodev\Drafty\Interfaces\HasDraftable;

class Post extends Model implements HasDraftable
{
    use Draftable;

    /**
     * Get the post's draft.
     */
    public function draft()
    {
        return $this->morphOne('Nekodev\Drafty\Models\Draft', 'draftable');
    }
}

Draft use polymorphique relations. You must implements HasDraftable interface and use draft() method. This method will return a Draft class model.

Basic usage

Example from controller

private function saveDraftPost(Request $request, Post $post)
{
    // Update Model data
    $post->title = $request->title;
    $post->content = $request->content;

    // create or update draft and return it 
    $data = $post->saveAsDraft();

    return $data;
}

When $post->save() method will call, draft will automatically deleted. You must call $post->applyDraft() before calling save method.

Draft customization

You can create your owns Drafts Models. php artisan make:draft <draft name>

php artisan make:draft PostDraft

This command will create a draft méthod from app/Drafts directory.

namespace App\Drafts;

use Nekodev\Drafty\Models\Draft as DraftModel;

class PostDraft extends DraftModel
{

}

Example usage

If you whant add some relationship :

POST MODEL

namespace App;

use Illuminate\Database\Eloquent\Model;
use Nekodev\Drafty\Traits\Draftable;
use Nekodev\Drafty\Interfaces\HasDraftable;
use App\Category;

class Post extends Model implements HasDraftable
{
    use Draftable;

    public $fillable = [ 'title', 'content' ];

    /**
     * Get the post's draft.
     */
    public function draft()
    {
        return $this->morphOne('App\Drafts\PostDraft', 'draftable');
    }

    /**
     * Return categories from post
     */
    public function categories()
    {
        return $this->morphToMany('App\Category', 'categorable');
    }
}

CUSTOM DRAFT MODEL

namespace App\Drafts;

use Nekodev\Drafty\Models\Draft as DraftModel;
use App\Category;

class PostDraft extends DraftModel
{
    /**
     * Return categories from draft
     */
    public function categories()
    {
        return $this->morphToMany('App\Category', 'categorable');
    }
}

You must create polymorphic relation from your model that can have draft.

Usage with Spatie Media Livrary

POST MODEL

namespace App;

use Illuminate\Database\Eloquent\Model;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Nekodev\Drafty\Traits\Draftable;
use Nekodev\Drafty\Interfaces\HasDraftable;
use App\Category;

class Post extends Model implements HasMedia, HasDraftable
{
    use Draftable;
    use InteractsWithMedia;

    public $fillable = [ 'title', 'content' ];

    /**
     * Get the post's draft.
     */
    public function draft()
    {
        return $this->morphOne('App\Drafts\PostDraft', 'draftable');
    }
}

CUSTOM DRAFT MODEL

namespace App\Drafts;

use Nekodev\Drafty\Models\Draft as DraftModel;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;

class PostDraft extends DraftModel implements HasMedia
{
    use InteractsWithMedia;
}

On apply save method from Post model, all media collection from Post model are remove and replace by PostDraft model collection.

Credit

alt text @nekodesigner (NekoDev) - Tahar CHIBANE | FullStack Developer

Enjoy !! 😃