Installation:
composer require ekyna/file-manager-bundle
Add to config/bundles.php:
Ekyna\FileManagerBundle\EkynaFileManagerBundle::class => ['all' => true],
Routing:
Ensure the bundle’s routes are imported in config/routes.yaml:
ekyna_file_manager:
resource: "@EkynaFileManagerBundle/Resources/config/routing.yml"
prefix: /admin/file-manager
First Use Case: Embed the file manager in a form via Twig:
{{ form_widget(form.file_field) }}
<script>
$(document).ready(function() {
$('#file_field').fileManager({
url: '{{ path('ekyna_file_manager_browser') }}',
uploadUrl: '{{ path('ekyna_file_manager_upload') }}',
deleteUrl: '{{ path('ekyna_file_manager_delete') }}'
});
});
</script>
File Uploads:
uploadUrl endpoint for direct uploads from a form or AJAX calls.File constraint:
use Symfony\Component\Validator\Constraints\File;
$constraints = new File([
'maxSize' => '1024k',
'mimeTypes' => ['image/jpeg', 'image/png'],
]);
File Browsing:
{% extends '@EkynaFileManager/FileManager/browser.html.twig' %}
{% block file_row %}
<tr>
<td>{{ file.name }}</td>
<td>{{ file.size|filesize }}</td>
<td>{{ file.mimeType }}</td>
<td>
<a href="{{ path('ekyna_file_manager_download', {'id': file.id}) }}">Download</a>
</td>
</tr>
{% endblock %}
Permissions:
# config/services.yaml
Ekyna\FileManagerBundle\Security\FileManagerVoter:
arguments:
- '@security.token_storage'
- ['ROLE_FILE_MANAGER_EDIT']
Integration with Forms:
file_manager type for Symfony forms:
$builder->add('document', 'file_manager', [
'url' => $this->generateUrl('ekyna_file_manager_browser'),
'upload_url' => $this->generateUrl('ekyna_file_manager_upload'),
'allowed_mime_types' => ['application/pdf'],
]);
Outdated Dependencies:
symfony/polyfill if integrating with Symfony 4/5/6:
composer require symfony/polyfill-*
Missing Documentation:
TODO sections in the README imply incomplete features. Refer to the Symfony CMF FileManagerBundle for modern alternatives.Permission Quirks:
FileManagerVoter to handle granular roles:
public function supportsAttribute($attribute)
{
return in_array($attribute, ['EDIT', 'DELETE', 'VIEW']);
}
Template Overrides:
templates/bundles/ekynafilemanager/
Check Routes:
Run php bin/console debug:router | grep ekyna_file_manager to verify endpoints.
Log Uploads:
Enable debug mode and check var/log/dev.log for upload errors:
// config/packages/dev/monolog.yaml
handlers:
main:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: debug
File Storage:
Default storage is app/Resources/files/. Change it via config (if available) or override the FileManager service:
services:
ekyna_file_manager.file_manager:
arguments:
- '%kernel.project_dir%/custom_uploads'
Custom File Model:
Extend the Ekyna\FileManagerBundle\Entity\File entity to add metadata:
namespace App\Entity;
use Ekyna\FileManagerBundle\Entity\File as BaseFile;
class File extends BaseFile
{
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $customMetadata;
}
Event Listeners: Subscribe to file events (if supported) to trigger actions:
// src/EventListener/FileManagerListener.php
class FileManagerListener
{
public function onFileUpload(FileUploadEvent $event)
{
// Post-upload logic
}
}
API Integration: Use the bundle’s endpoints as a headless API by returning JSON responses:
// src/Controller/FileManagerController.php
public function uploadAction(Request $request)
{
$response = parent::uploadAction($request);
$response->setContent(json_encode([
'success' => true,
'fileId' => $file->getId(),
]));
return $response;
}
How can I help you explore Laravel packages today?