A Laravel package that simplifies status management for Eloquent models.
HasActiveScope
Trait: 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:install
for easy setup. - PHP 8.3 Support.
You can install the package via Composer:
composer require thefeqy/laravel-model-status
php artisan model-status:install
This will:
- Publish the config file (
config/model-status.php
). - Set up required environment variables in
.env
and.env.example
. - Ensure your project is ready to use the package.
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;
},
];
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=disabled
Now, the package will automatically adapt to your setup.
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.
Get Active Models (Default Behavior)
$activeProducts = Product::all(); // Returns only active products
Get 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!";
}
To ensure status
is always cast to a Status
object, use the StatusCast
class.
use Thefeqy\ModelStatus\Casts\StatusCast;
class Product extends Model
{
use HasActiveScope;
protected $fillable = ['name', 'status', 'category_id'];
protected $casts = [
'status' => StatusCast::class,
];
}
$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()
.
If a model is deactivated, its related models can also be automatically deactivated.
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();
The package includes the EnsureAuthenticatedUserIsActive
middleware, which enforces that only users with an active status can access certain 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!';
});
});
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;
},
If you need a different column name or status values, update .env
:
MODEL_STATUS_COLUMN=state
MODEL_STATUS_ACTIVE=enabled
MODEL_STATUS_INACTIVE=disabled
Now, models will use:
$table->string('state', 10)->default('enabled');
instead of:
$table->string('status', 10)->default('active');
Run tests using Pest PHP:
composer test
or
vendor/bin/phpunit
If you discover a security vulnerability, please report it via email: 📩 thefeqy@gmail.com
Want to improve this package? Check out CONTRIBUTING for contribution guidelines.
This package is open-source software licensed under the MIT License.