sajadsdi/laravel-file-management
This package provides a robust file management system for Laravel applications, handling core CRUD operations with trash functionality. To begin, install via Composer:
composer require vendor/package-name
Publish the configuration and migrations (if applicable) to customize behavior:
php artisan vendor:publish --provider="Vendor\PackageName\PackageServiceProvider"
php artisan migrate
First Use Case: Upload a file and handle its lifecycle:
use Vendor\PackageName\Facades\FileManager;
// Upload a file
$file = FileManager::upload($request->file('file'), 'storage/path');
// Trash the file (soft delete)
$file->trash();
// Restore from trash
$file->restore();
// Permanently delete
$file->delete();
// Update metadata (e.g., custom attributes)
$file->update(['custom_field' => 'value']);
Key classes to explore:
FileManager facade (main entry point)File model (represents managed files)Trash helper (for soft-deleted files)File Upload & Storage
Use FileManager::upload() with a Uploadable interface-compliant file (Laravel UploadedFile or custom). Specify a destination path (relative to storage/app by default). Example:
$file = FileManager::upload($request->file('document'), 'contracts/{year}');
Lifecycle Management Leverage soft-deletes for compliance/retention:
// Bulk trash files by directory
FileManager::trashDirectory('contracts/2023');
// Restore all trashed files
FileManager::restoreTrashed();
Metadata & Extensions
Attach custom attributes to files via update():
$file->update([
'client_id' => $client->id,
'expiry_date' => now()->addYear(),
]);
file.uploaded, file.trashed, etc., in EventServiceProvider:
protected $listen = [
'Vendor\PackageName\Events\FileUploaded' => [
'App\Listeners\LogUpload',
],
];
FileManager::rules() for form validation:
$request->validate([
'file' => ['required', FileManager::rules()->maxSize(10 * 1024)->allowedTypes(['pdf'])]
]);
FileResource:
return new FileResource($file);
Trash Retention By default, trashed files are not purged automatically. Schedule a cleanup job:
// config/package.php
'trash_retention_days' => 30, // Default: 30 days
Use FileManager::purgeTrash() to manually delete old files.
Path Resolution
Paths are resolved relative to storage/app. Avoid hardcoding absolute paths in logic. Use:
$fullPath = FileManager::getFullPath($file->path);
Concurrency
File operations (e.g., update()) may conflict if multiple requests target the same file. Use optimistic locking:
$file->update(['views' => $file->views + 1], ['lock_for_update' => true]);
'debug' => env('APP_DEBUG', false),
$trashed = FileManager::trashedFiles()->get();
config/filesystems) has write permissions.Custom Storage
Override the default disk by binding a FileStorage implementation:
$app->bind('Vendor\PackageName\Contracts\FileStorage', function () {
return new S3FileStorage();
});
File Events
Extend core events (e.g., FileUploaded) by publishing event classes:
php artisan vendor:publish --tag=package-events
Validation Rules
Create custom rules by extending FileValidationRule:
class CustomRule extends FileValidationRule {
public function passes($attribute, $value) {
// Custom logic
}
}
Register via config:
'validation_rules' => [
'custom_rule' => \App\Rules\CustomRule::class,
],
How can I help you explore Laravel packages today?