novius/laravel-publishable

A Laravel Eloquent model trait for publishable resource

3.0.0 2024-07-10 13:50 UTC

This package is auto-updated.

Last update: 2024-11-10 14:38:14 UTC


README

Novius CI Packagist Release License: AGPL v3

Introduction

A package for making Laravel Eloquent models "publishable" using 4 states : draft, published, unpublished and scheduled. Manage an additional published_first_at date for order by and display.

Requirements

  • Laravel >= 10.0
  • PHP >= 8.2

NOTE: These instructions are for Laravel >= 10.0 and PHP >= 8.2 If you are using prior version, please see the previous version's docs.

Installation

You can install the package via composer:

composer require novius/laravel-publishable
php artisan vendor:publish --provider="Novius\Publishable\LaravelPublishableServiceProvider" --tag=lang

Usage

Migrations

Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->text('text');
    $table->timestamps();
    $table->publishable(); // Macro provided by the package
});

Eloquent Model Trait

namespace App\Models;

use \Illuminate\Database\Eloquent\Model;
use \Novius\LaravelPublishable\Publishable;

class Post extends Model {
    use Publishable;
    ...
}

Extensions

The extensions shipped with this trait include; notPublished, published, onlyDrafted, onlyExpired, onlyWillBePublished and can be used accordingly:

$post = Post::first();
$post->isPublished();

$postsPublished = Post::all();
$postsPublished = Post::query()->published();
$onlyNotPublishedPosts = Post::query()->notPublished();
$onlyDraftedPosts = Post::query()->onlyDrafted();
$onlyExpiredPosts = Post::query()->onlyExpired();
$onlyWillBePublishedPosts = Post::query()->onlyWillBePublished();

When not specifing any additional scopes, all not published models are excluded from the query by default to prevent leaks of not published data.

Testing

composer run test

CS Fixer

Lint your code with Laravel Pint using:

composer run cs-fix

Licence

This package is under GNU Affero General Public License v3 or (at your option) any later version.