lambdadigamma / laravel-publishable
A Laravel Eloquent model trait for publishing and unpublishing
Requires
- php: ^8.0|^8.1|^8.2|^8.3
- illuminate/database: ^8.0 || ^9.0 || ^10.0 || ^11.0
- illuminate/support: ^8.0 || ^9.0 || ^10.0 || ^11.0
Requires (Dev)
- illuminate/pagination: ^v9.52.0|| ^v10.0.0 || ^v11.0.0
- orchestra/testbench: ^v9.1.0
- pestphp/pest: ^v2.34.0
- spatie/test-time: ^1.2
README
A simple package for making Laravel Eloquent models 'publishable'. Not published models are excluded from queries by default but can be queried via extra scope.
This package allows easy publishing and unpublishing of models by combining scopes and macros.
How does it work?
The package provides a trait Publishable
for your Eloquent model.
Your database schema has to have a published_at
datetime column so that the trait can read and write it.
By reading this column the package can determine which models already have been published and provide the requested models.
Installation
You can install the package via composer:
composer require lambdadigamma/laravel-publishable
Usage
Migrations
The Publishable
trait works similarly to Laravel's SoftDeletes
trait. This package provides a macro for Laravel's Migration Builder.
Just use the publishedAt
macro in your migration to get started:
Schema::create('posts', function (Blueprint $table) { $table->id(); $table->string('title'); $table->text('text'); $table->timestamps(); $table->publishedAt(); // Macro provided by the package });
Eloquent Model Trait
After providing a published_at
timestamp on your model, you can use the Publishable
trait on your Eloquent model:
namespace App\Models; use \Illuminate\Database\Eloquent\Model; use \LaravelPublishable\Publishable; class Post extends Model { use Publishable; ... }
Extensions
The extensions shipped with this trait include; publish
, unpublish
, withNotPublished
, withoutPublished
, onlyPublished
and can be used accordingly:
$post = Post::first(); $post->publish(); $post->publishAt(now()->addHour(1)); $post->scheduleFor(new Carbon('2021-04-01 10:00:00')); $post->unpublish(); $postsWithNotPublished = Post::query()->withNotPublished(); $onlyNotPublishedPosts = Post::query()->onlyNotPublished();
When not specifing any additional scopes, all not published models are excluded from the query by default (withoutNotPublished
) to prevent leaks of not published data.
Testing
composer test
Changelog
Please see CHANGELOG for more information what has changed recently.
Contributing
Please see CONTRIBUTING for details.
Security
If you discover any security related issues, please email github@lambdadigamma.com instead of using the issue tracker.
Credits
License
The MIT License (MIT). Please see License File for more information.