Skip to content
This repository was archived by the owner on Jul 6, 2026. It is now read-only.

Commit 12fc07c

Browse files
committed
feat(refactor): restructure roles and permissions
- Contracts renamed: HasRoles -> Roles, HasPermissions -> Permissions - Traits moved to Concerns directory - Middleware updated for multiple roles/permissions - Model assignment methods accept Model|string - Added shared Concerns: ChecksRoles, ResolvesModels
1 parent 4d23199 commit 12fc07c

22 files changed

Lines changed: 963 additions & 623 deletions

CHANGELOG.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,93 @@
22

33
All notable changes to `guard-laravel` will be documented in this file.
44

5+
## v1.3.0 - 2026-02-02
6+
7+
### 🔨 Breaking Changes
8+
9+
- **Contracts renamed**: `HasRoles``Roles`, `HasPermissions``Permissions`
10+
- **Traits moved to Concerns directory**: All traits now in `src/Concerns/`
11+
- **Middleware updates**: All middlewares now support multiple roles/permissions via variadic parameters
12+
- **Method signatures updated**: All model assignment methods now accept `Model|string` parameters
13+
- **Shared concerns added**: `ChecksRoles` and `ResolvesModels` traits for DRY principle
14+
15+
### ✨ New Features
16+
17+
- **Improved Architecture**:
18+
- Contracts and traits properly separated with no naming conflicts
19+
- New `ChecksRoles` trait with shared role checking logic
20+
- New `ResolvesModels` trait with shared model resolution logic
21+
- Better type hints throughout codebase
22+
- Improved code organization and maintainability
23+
24+
- **Middleware Enhancements**:
25+
- `RoleMiddleware`: Now supports multiple roles (comma-separated or variadic)
26+
- `PermissionMiddleware`: Now supports multiple permissions
27+
- `RoleOrPermissionMiddleware`: Now supports multiple roles or permissions
28+
- All middlewares handle both formats: `role:admin,editor` or `role:admin`, `role:editor`
29+
30+
- **Code Quality**:
31+
- 0 static analysis errors (Larastan)
32+
- All files pass Laravel Pint linting
33+
- Follows SOLID principles
34+
- Proper separation of concerns
35+
36+
- **Testing**:
37+
- Added comprehensive middleware tests (10 new tests)
38+
- Test User model now extends Authenticatable (proper Laravel usage)
39+
- All 42 tests passing (77 assertions)
40+
- 35 source files
41+
42+
- **Documentation**:
43+
- Updated README with new architecture
44+
- Complete UPGRADE.md guide
45+
- Clarified middleware usage with examples
46+
47+
### 📚 Documentation
48+
49+
- Updated README.md with new contract and trait structure
50+
- Comprehensive UPGRADE.md with migration guide
51+
- Added examples for middleware multiple parameters
52+
- Clarified import statements for new structure
53+
54+
### 🛠️ Code Quality
55+
56+
- Refactored code to follow DRY principle
57+
- Improved type hints for better IDE support
58+
- Better documentation comments
59+
- Enhanced error messages
60+
61+
### 🔄 Migration Requirements
62+
63+
Users upgrading to v1.3.0 need to:
64+
65+
1. Update imports from `Guard\HasRoles` to `Guard\Concerns\HasRoles`
66+
2. Update imports from `Guard\HasPermissions` to `Guard\Concerns\HasPermissions`
67+
3. Update middleware usage to support multiple roles/permissions (if needed)
68+
4. Test application thoroughly after upgrade
69+
70+
### 📊 Statistics
71+
72+
- **Source files**: 35 (increased from 26)
73+
- **Tests passing**: 42 (increased from 36)
74+
- **Assertions**: 77 (increased from 69)
75+
- **Static analysis**: 0 errors
76+
- **Code quality**: All files pass Laravel Pint
77+
78+
### 🐛 Bug Fixes
79+
80+
- Fixed middleware exception handling in test environment
81+
- Improved type resolution in model assignment methods
82+
- Fixed import paths in test files
83+
84+
### 🎯 Improvements
85+
86+
- **SOLID Principles**: Better separation of concerns
87+
- **DRY Principle**: Shared traits reduce code duplication
88+
- **Naming Conventions**: Traits in Concerns, contracts as interfaces
89+
- **Flexibility**: Middleware now supports multiple parameters
90+
- **Maintainability**: Better code organization
91+
592
## v1.1.0 - 2026-01-30
693

794
### 🔨 Breaking Changes

CLAUDE.md

Lines changed: 0 additions & 179 deletions
This file was deleted.

README.md

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,11 @@ If you find Guard Laravel helpful, please consider **sponsoring** the project. Y
5454

5555
- **PHP 8.2, 8.3, 8.4, & 8.5 & Laravel 10, 11, & 12** - Modern PHP and Laravel features
5656
- **Role & Permission Management** - Create and manage roles with permissions
57+
- **Separate Concerns** - Traits and contracts are properly separated for better maintainability
5758
- **Wildcard Permissions** - Use wildcard patterns like `posts.*` for flexible permission checking
5859
- **Permission Groups** - Organize permissions into groups
5960
- **Guarded Roles** - Protect certain roles from deletion/modification
60-
- **Custom Middleware** - Built-in middleware for route protection
61+
- **Multiple Roles/Permissions** - Middleware now supports multiple roles/permissions at once
6162
- **Cache Support** - Intelligent caching with automatic invalidation
6263
- **Query Scopes** - Filter users by roles and permissions
6364
- **Custom Exceptions** - Better error messages
@@ -85,17 +86,19 @@ php artisan vendor:publish --tag="guard-migrations"
8586
php artisan migrate
8687
```
8788

88-
Add the `HasRoles` trait and `UserContract` interface to your User model:
89+
Add the `HasRoles` trait and `User` interface to your User model:
8990

9091
```php
9192
namespace App\Models;
9293

9394
use AmdadulHaq\Guard\Contracts\User as UserContract;
94-
use AmdadulHaq\Guard\HasRoles;
95+
use AmdadulHaq\Guard\Concerns\HasRoles;
96+
use AmdadulHaq\Guard\Concerns\HasPermissions;
9597

9698
class User extends Authenticatable implements UserContract
9799
{
98100
use HasRoles;
101+
use HasPermissions;
99102
}
100103
```
101104

@@ -276,13 +279,10 @@ $user->revokePermissionTo('posts.delete');
276279
$user->revokeAllPermissions();
277280

278281
// Check if user has direct permission
279-
$user->hasDirectPermission('posts.create'); // true
280-
281-
// Get all direct permissions for user
282-
$user->getDirectPermissions(); // Collection of permissions
282+
$user->hasPermission('posts.create'); // true
283283

284284
// Get all permissions (roles + direct)
285-
$user->getAllPermissions(); // Collection of all permissions
285+
$user->getPermissions(); // Collection of all permissions
286286
```
287287

288288
### Checking Roles
@@ -347,20 +347,38 @@ User::withPermissions('users.create')->get();
347347

348348
### Middleware
349349

350-
Protect routes using built-in middleware:
350+
Protect routes using built-in middleware. All middlewares support multiple roles/permissions:
351351

352352
```php
353+
// Single permission
353354
Route::middleware('permission:users.create')->group(function () {
354355
Route::post('/users', [UserController::class, 'store']);
355356
});
356357

358+
// Multiple permissions (requires any of them)
359+
Route::middleware('permission:users.create,users.edit')->group(function () {
360+
Route::put('/users/{id}', [UserController::class, 'update']);
361+
});
362+
363+
// Single role
357364
Route::middleware('role:administrator')->group(function () {
358365
Route::delete('/users/{id}', [UserController::class, 'destroy']);
359366
});
360367

361-
Route::middleware('role_or_permission:users.create')->group(function () {
368+
// Multiple roles (requires any of them)
369+
Route::middleware('role:admin,editor')->group(function () {
370+
Route::get('/admin', [AdminController::class, 'dashboard']);
371+
});
372+
373+
// Role OR permission
374+
Route::middleware('role_or_permission:admin,users.create')->group(function () {
362375
Route::get('/users', [UserController::class, 'index']);
363376
});
377+
378+
// Multiple role_or_permission
379+
Route::middleware('role_or_permission:admin,editor,users.manage')->group(function () {
380+
Route::post('/manage', [Controller::class, 'handle']);
381+
});
364382
```
365383

366384
### Gate Integration

0 commit comments

Comments
 (0)