4.2 KiB
4.2 KiB
Core-PHP - January 2026
Features Implemented
Actions Pattern
Core\Actions\Action trait for single-purpose business logic classes.
use Core\Actions\Action;
class CreateThing
{
use Action;
public function handle(User $user, array $data): Thing
{
// Complex business logic here
}
}
// Usage
$thing = CreateThing::run($user, $data);
Location: src/Core/Actions/Action.php, src/Core/Actions/Actionable.php
Multi-Tenant Data Isolation
Files:
MissingWorkspaceContextException- Dedicated exception with factory methodsWorkspaceScope- Strict mode enforcement, throws on missing contextBelongsToWorkspace- Enhanced trait with context validationRequireWorkspaceContextmiddleware
Usage:
Account::query()->forWorkspace($workspace)->get();
Account::query()->acrossWorkspaces()->get();
WorkspaceScope::withoutStrictMode(fn() => Account::all());
Seeder Auto-Discovery
Files:
src/Core/Database/Seeders/SeederDiscovery.php- Scans modules for seederssrc/Core/Database/Seeders/SeederRegistry.php- Manual registrationsrc/Core/Database/Seeders/CoreDatabaseSeeder.php- Base class with --exclude/--onlysrc/Core/Database/Seeders/Attributes/- SeederPriority, SeederAfter, SeederBefore
Usage:
class FeatureSeeder extends Seeder
{
public int $priority = 10;
public function run(): void { ... }
}
#[SeederAfter(FeatureSeeder::class)]
class PackageSeeder extends Seeder { ... }
Config: core.seeders.auto_discover, core.seeders.paths, core.seeders.exclude
Team-Scoped Caching
Files:
src/Mod/Tenant/Services/WorkspaceCacheManager.php- Cache management servicesrc/Mod/Tenant/Concerns/HasWorkspaceCache.php- Trait for custom caching- Enhanced
BelongsToWorkspacetrait
Usage:
$projects = Project::ownedByCurrentWorkspaceCached(300);
$accounts = Account::forWorkspaceCached($workspace, 600);
Config: core.workspace_cache.enabled, core.workspace_cache.ttl, core.workspace_cache.use_tags
Activity Logging
Files:
src/Core/Activity/Concerns/LogsActivity.php- Model traitsrc/Core/Activity/Services/ActivityLogService.php- Query servicesrc/Core/Activity/Models/Activity.php- Extended modelsrc/Core/Activity/View/Modal/Admin/ActivityFeed.php- Livewire componentsrc/Core/Activity/Console/ActivityPruneCommand.php- Cleanup command
Usage:
use Core\Activity\Concerns\LogsActivity;
class Post extends Model
{
use LogsActivity;
}
$activities = app(ActivityLogService::class)
->logBy($user)
->forWorkspace($workspace)
->recent(20);
Config: core.activity.enabled, core.activity.retention_days
Requires: composer require spatie/laravel-activitylog
Bouncer Request Whitelisting
Files:
src/Core/Bouncer/Gate/Migrations/- Database tablessrc/Core/Bouncer/Gate/Models/ActionPermission.php- Permission modelsrc/Core/Bouncer/Gate/Models/ActionRequest.php- Audit log modelsrc/Core/Bouncer/Gate/ActionGateService.php- Core servicesrc/Core/Bouncer/Gate/ActionGateMiddleware.php- Middlewaresrc/Core/Bouncer/Gate/Attributes/Action.php- Controller attributesrc/Core/Bouncer/Gate/RouteActionMacro.php- Route macro
Usage:
// Route-level
Route::post('/products', [ProductController::class, 'store'])
->action('product.create');
// Controller attribute
#[Action('product.delete', scope: 'product')]
public function destroy(Product $product) { ... }
Config: core.bouncer.training_mode, core.bouncer.enabled
CDN Integration Tests
Comprehensive test suite for CDN operations and asset pipeline.
Files:
src/Core/Tests/Feature/CdnIntegrationTest.php- Full integration test suite
Coverage:
- URL building (CDN, origin, private, apex)
- Asset pipeline (upload, store, delete)
- Storage operations (public/private buckets)
- vBucket isolation and path generation
- URL versioning and query parameters
- Signed URL generation
- Large file handling
- Special character handling in filenames
- Multi-file deletion
- File existence checks and metadata
Test count: 30+ assertions across URL generation, storage, and retrieval