ckfinder/ckfinder-symfony3-bundle
Installation
composer require ckfinder/ckfinder-symfony3-bundle
Add the bundle to app/AppKernel.php:
new CKSource\CKFinderBundle\CKFinderBundle(),
Configuration
Update app/config/config.yml:
ckfinder:
license_key: "YOUR_LICENSE_KEY" # Required for production
upload_url: "%kernel.root_dir%/../web/uploads" # Default upload directory
access_control:
user_files: ~ # Allow users to access their own files
integrations:
symfony_assets: ~ # Enable Symfony asset integration
First Use Case: File Upload
Inject the CKFinder service in a controller:
use CKSource\CKFinderBundle\CKFinder\CKFinderInterface;
class MyController extends Controller
{
public function uploadAction(CKFinderInterface $ckfinder)
{
// Handle uploads via CKFinder's built-in routes
return $this->render('my_template.html.twig');
}
}
Use the default CKFinder route (/ckfinder/core/connector) in your Twig template:
<input type="text" name="file-upload" data-ckfinder="true">
Twig Integration
Use ckfinder_asset Twig function to generate URLs:
{{ ckfinder_asset('images/logo.png') }}
Configure in config.yml:
ckfinder:
integrations:
twig: ~
Custom Upload Handlers
Extend the default upload logic by creating a custom UploadAdapter:
namespace App\CKFinder;
use CKSource\CKFinderBundle\CKFinder\Adapter\UploadAdapterInterface;
class CustomUploadAdapter implements UploadAdapterInterface
{
public function upload($file, $destination)
{
// Custom logic (e.g., rename files, validate extensions)
return $destination . '/custom_' . $file->getClientOriginalName();
}
}
Register in services.yml:
services:
app.ckfinder.upload_adapter:
class: App\CKFinder\CustomUploadAdapter
tags:
- { name: ckfinder.upload_adapter }
Permissions & ACL Dynamically restrict file access per user:
ckfinder:
access_control:
user_files: "@=(user.isAdmin())"
Or use a custom callback:
ckfinder:
access_control:
user_files: "@=service('app.ckfinder.acl').canAccess(file, user)"
License Key
license_key in production throws CKFinderException.ckfinder:
license_key: "%env(CKFINDER_LICENSE_KEY)%"
File Permissions
upload_url directory lacks write permissions.www-data) owns the directory:
chown -R www-data:www-data web/uploads
chmod -R 755 web/uploads
Asset URL Generation
ckfinder_asset() returns incorrect URLs if asset() is misconfigured.symfony_assets integration is enabled and base_url is set in config.yml:
ckfinder:
base_url: "%app.base_url%" # e.g., "http://example.com"
Enable Debug Mode
Add to config.yml to log errors:
ckfinder:
debug: true
Check var/log/ckfinder.log for upload/access issues.
Connector Errors
If the /ckfinder/core/connector route returns JSON errors:
{"error":{"code":1,"message":"Access denied."}}
Verify:
access_control rules in config.yml.Custom File Types
Restrict allowed extensions via config.yml:
ckfinder:
allowed_file_types: ["jpg", "png", "pdf"]
Event Listeners Hook into upload events:
// src/AppBundle/EventListener/CKFinderListener.php
use CKSource\CKFinderBundle\Event\UploadEvent;
class CKFinderListener
{
public function onUpload(UploadEvent $event)
{
$file = $event->getFile();
// Modify metadata, e.g., add watermark
}
}
Register in services.yml:
services:
app.ckfinder.listener:
class: App\EventListener\CKFinderListener
tags:
- { name: kernel.event_listener, event: ckfinder.upload, method: onUpload }
Database Backend
For non-filesystem storage (e.g., S3), implement a custom StorageAdapter:
use CKSource\CKFinderBundle\CKFinder\Adapter\StorageAdapterInterface;
class S3StorageAdapter implements StorageAdapterInterface
{
public function save($file, $destination)
{
// Upload to S3 and return public URL
}
}
Register as the default adapter in config.yml:
ckfinder:
storage_adapter: "@app.s3_storage_adapter"
How can I help you explore Laravel packages today?