thefeqy/laravel-model-status
A Laravel package to automate adding configurable status columns to models and migrations. This package provides an easy-to-use HasActiveScope trait, a Status enum, middleware for ensuring active users, and a custom Artisan command to streamline your workflow.
๐ Laravel Model Status
A Laravel package that simplifies status management for Eloquent models.
Table of Contents
Features
HasActiveScopeTrait: Automatically filters models with active status.- Admin Bypass: Admin users can see all models, including inactive ones.
- Helper Methods:
$model->status->isActive()and$model->status->isInactive(). - Dynamic Configuration: Define custom statuses & column names via
.env. - Installation Command:
php artisan model-status:installfor easy setup. - PHP 8.3 Support.
Installation
You can install the package via Composer:
composer require thefeqy/laravel-model-statusStep 1: Run the Installation Command
php artisan model-status:installThis will:
- Publish the config file (
config/model-status.php). - Set up required environment variables in
.envand.env.example. - Ensure your project is ready to use the package.
Configuration
You can customize the package settings in:
config/model-status.php
return [
'column_name' => env('MODEL_STATUS_COLUMN', 'status'),
'default_value' => env('MODEL_STATUS_ACTIVE', 'active'),
'inactive_value' => env('MODEL_STATUS_INACTIVE', 'inactive'),
'admin_detector' => function () {
return auth()->check() && auth()->user()->is_admin;
},
];Using .env Variables
Instead of modifying config/model-status.php, you can override values in .env:
.env
MODEL_STATUS_COLUMN=state
MODEL_STATUS_ACTIVE=enabled
MODEL_STATUS_INACTIVE=disabledNow, the package will automatically adapt to your setup.
Usage
Using the HasActiveScope Trait
To enable status management in a model:
use Thefeqy\ModelStatus\Traits\HasActiveScope;
class Product extends Model
{
use HasActiveScope;
protected $fillable = ['name'];
}Now, inactive models are automatically excluded from queries.
Querying Models
Get Active Models (Default Behavior)
$activeProducts = Product::all(); // Returns only active productsGet All Models (Including Inactive)
$allProducts = Product::inActive()->get();Manually Activating / Deactivating a Model
$product = Product::find(1);
$product->activate(); // Set status to "active"
$product->deactivate(); // Set status to "inactive"Checking a Model's Status
if ($product->status->isActive()) {
echo "Product is active!";
}
if ($product->status->isInactive()) {
echo "Product is inactive!";
}Using Status Casting
To ensure status is always cast to a Status object, use the StatusCast class.
Apply Status Casting in Models
use Thefeqy\ModelStatus\Casts\StatusCast;
class Product extends Model
{
use HasActiveScope;
protected $fillable = ['name', 'status', 'category_id'];
protected $casts = [
'status' => StatusCast::class,
];
}Example Usage
$product = Product::find(1);
if ($product->status->isActive()) {
echo "Product is active!";
}Now, $product->status is an instance of Status, allowing method calls like isActive() and isInactive().
Cascade Deactivation
If a model is deactivated, its related models can also be automatically deactivated.
Example
class Category extends Model
{
use HasActiveScope;
protected $fillable = ['name', 'status'];
protected array $cascadeDeactivate = ['products'];
public function products()
{
return $this->hasMany(Product::class);
}
}Now, deactivating a category will also deactivate all products under it:
$category = Category::find(1);
$category->deactivate();Using the Middleware
The package includes the EnsureAuthenticatedUserIsActive middleware, which enforces that only users with an active status can access certain routes.
Add Middleware to Routes
Instead of registering a string alias for the middleware, you can reference it by class name in your route definition:
use Illuminate\Support\Facades\Route;
use Thefeqy\ModelStatus\Middleware\EnsureAuthenticatedUserIsActive;
Route::middleware(['auth', EnsureAuthenticatedUserIsActive::class])->group(function () {
Route::get('/dashboard', function () {
return 'Welcome to your dashboard!';
});
});Admin Bypass for Active Scope
By default, admin users can see inactive models.
This behavior is controlled in config/model-status.php:
'admin_detector' => function () {
return auth()->check() && auth()->user()->is_admin;
},Advanced Configuration
If you need a different column name or status values, update .env:
MODEL_STATUS_COLUMN=state
MODEL_STATUS_ACTIVE=enabled
MODEL_STATUS_INACTIVE=disabledNow, models will use:
$table->string('state', 10)->default('enabled');instead of:
$table->string('status', 10)->default('active');Testing
Run tests using Pest PHP:
composer test
or
vendor/bin/phpunitSecurity
If you discover a security vulnerability, please report it via email:
๐ฉ thefeqy@gmail.com
Contributing
Want to improve this package? Check out CONTRIBUTING for contribution guidelines.
License
This package is open-source software licensed under the MIT License.
