esign / laravel-model-files
Associate files with your Laravel Models
Installs: 2 669
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 3
Forks: 0
Open Issues: 0
Requires
- php: ^8.0
- esign/laravel-underscore-translatable: ^1.4
- illuminate/http: ^8.74|^9.0|^10.0|^11.0
- illuminate/support: ^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.5
- orchestra/testbench: ^6.0|^7.0|^8.02|^9.0
- phpunit/phpunit: ^9.0|^10.0
README
This package allows you to store files for models in an opinionated way.
Installation
You can install the package via composer:
composer require esign/laravel-model-files
Usage
Preparing your model
To associate files with your model you need to use the Esign\ModelFiles\Concerns\HasFiles
trait on the model.
use Esign\ModelFiles\Concerns\HasFiles; use Illuminate\Database\Eloquent\Model; class Post extends Model { use HasFiles; }
The database structure should look like the following:
Schema::create('posts', function (Blueprint $table) { $table->id(); $table->boolean('file')->default(0); $table->string('file_filename')->nullable(); $table->string('file_mime')->nullable(); });
Configuring the disk
By default, the files will be associated with the default disk configured in your config/filesystems.php
file.
You may override this by defining the getFileDisk
method on your model.
use Esign\ModelFiles\Concerns\HasFiles; use Illuminate\Database\Eloquent\Model; class Post extends Model { use HasFiles; public function getFileDisk(): string { return 'public'; } }
Storing files
To store files you may use the storeFile
method.
This method accepts instances of both the Illuminate\Http\File
and Illuminate\Http\UploadedFile
classes.
$post->storeFile('file', $request->file('attachment'));
Retrieving file info
$post->hasFile('file'); // returns true/false $post->getFolderPath('file'); // returns posts/file $post->getFilePath('file'); // returns posts/file/1.pdf $post->getFilePathOnDisk('file'); // returns /path/to/storage/app/public/posts/file/1.pdf $post->getFileMime('file'); // returns application/pdf $post->getFileExtension('file'); // returns pdf $post->getFileUrl('file'); // returns https://www.example.com/storage/posts/file/1.pdf $post->getVersionedFileUrl('file'); // returns https://www.example.com/storage/posts/file/1.pdf?t=1675776047
Deleting files
$post->deleteFile('file');
Using with underscore translatable
This package ships with support for the underscore translatable package.
Make sure to include the file, filename and mime columns within the translatable
array:
use Esign\ModelFiles\Concerns\HasFiles; use Esign\UnderscoreTranslatable\UnderscoreTranslatable; use Illuminate\Database\Eloquent\Model; class UnderscoreTranslatablePost extends Model { use HasFiles; use UnderscoreTranslatable; public $translatable = [ 'document', 'document_filename', 'document_mime', ]; }
Next up, your migrations should look like the following:
Schema::create('posts', function (Blueprint $table) { $table->id(); $table->boolean('document_en')->default(0); $table->boolean('document_nl')->default(0); $table->string('document_filename_en')->nullable(); $table->string('document_filename_nl')->nullable(); $table->string('document_mime_en')->nullable(); $table->string('document_mime_nl')->nullable(); });
You may now use the internal methods using the default or the specific locale:
$post->hasFile('document'); // returns true/false $post->getFolderPath('document'); // returns posts/document_en $post->getFilePath('document'); // returns posts/document_en/1.pdf $post->getFileMime('document'); // returns application/pdf $post->getFileExtension('document'); // returns pdf $post->getFileUrl('document'); // returns https://www.example.com/storage/posts/document_en/1.pdf $post->getVersionedFileUrl('document'); // returns https://www.example.com/storage/posts/document_en/1.pdf?t=1675776047
$post->hasFile('document_en'); // returns true/false $post->getFolderPath('document_en'); // returns posts/document_en $post->getFilePath('document_en'); // returns posts/document_en/1.pdf $post->getFileMime('document_en'); // returns application/pdf $post->getFileExtension('document_en'); // returns pdf $post->getFileUrl('document_en'); // returns https://www.example.com/storage/posts/document_en/1.pdf $post->getVersionedFileUrl('document_en'); // returns https://www.example.com/storage/posts/document_en/1.pdf?t=1675776047
Testing
composer test
License
The MIT License (MIT). Please see License File for more information.