mulertech/file-bundle

Symfony bundle for file upload management with metadata tracking, configurable validation, and extensible entity

Maintainers

Package info

github.com/mulertech/file-bundle

Type:symfony-bundle

pkg:composer/mulertech/file-bundle

Statistics

Installs: 25

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-04-04 21:53 UTC

This package is auto-updated.

Last update: 2026-04-06 12:13:03 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub PHPStan Action Status GitHub Security Action Status Total Downloads Test Coverage

Symfony bundle for file upload management with metadata tracking, configurable validation, and an extensible entity.

Requirements

  • PHP 8.4+
  • Symfony 6.4+ or 7.0+
  • Doctrine ORM 2.19+ or 3.0+

Installation

composer require mulertech/file-bundle

Configuration

# config/packages/mulertech_file.yaml
mulertech_file:
    storage_directory: '%kernel.project_dir%/var/documents'
    file_class: App\Entity\File
    # max_file_size: 52428800  # 50MB (default)
    # directory_strategy: null  # Service ID for custom DirectoryStrategyInterface
    # allowed_mime_types:       # Override default MIME types
    #     - 'application/pdf'
    #     - 'image/jpeg'

Usage

1. Create your File entity

Extend the provided AbstractFile MappedSuperclass:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use MulerTech\FileBundle\Entity\AbstractFile;

#[ORM\Entity]
#[ORM\Table(name: 'files')]
class File extends AbstractFile
{
    #[ORM\ManyToOne]
    #[ORM\JoinColumn(nullable: false)]
    private User $uploadedBy;

    // Add your own relations and fields...
}

2. Implement FileUploaderInterface

Your User entity must implement FileUploaderInterface:

use MulerTech\FileBundle\Model\FileUploaderInterface;

class User implements FileUploaderInterface
{
    public function getId(): ?int { /* ... */ }
}

3. Upload files

Inject FileManagerInterface in your controller or service:

use MulerTech\FileBundle\Service\FileManagerInterface;

class FileController
{
    public function upload(FileManagerInterface $fileManager, Request $request): Response
    {
        $uploadedFile = $request->files->get('file');
        $file = $fileManager->upload($uploadedFile, $user);

        // $file is your concrete entity, persisted and flushed
    }
}

4. Custom directory strategy (optional)

Implement DirectoryStrategyInterface to control where files are stored:

use MulerTech\FileBundle\Storage\DirectoryStrategyInterface;
use MulerTech\FileBundle\Model\FileUploaderInterface;

class ProjectDirectoryStrategy implements DirectoryStrategyInterface
{
    public function getRelativeDirectory(FileUploaderInterface $uploader, ?object $context = null): string
    {
        if ($context instanceof Project) {
            return sprintf('project_%d', $context->getId());
        }

        return sprintf('user_%d', $uploader->getId());
    }
}

Then configure:

mulertech_file:
    directory_strategy: App\Storage\ProjectDirectoryStrategy

5. Twig functions

{% if file_exists_on_disk(file) %}
    <span>{{ format_file_size(file.size) }}</span>
{% endif %}

Testing

./vendor/bin/mtdocker test-ai

License

MIT