anacona16/sonata-media-webcam-provider-bundle
Install the Bundle
composer require anacona16/sonata-media-webcam-provider-bundle
sonata-project/media-bundle is installed (v3.0 or v4.0).Enable the Bundle
config/bundles.php:
Anacona16\Bundle\SonataMediaWebcamProviderBundle\SonataMediaWebcamProviderBundle::class => ['all' => true],
Install Assets
php bin/console assets:install --symlink
Add JavaScript to Layout
Include in your base template (e.g., templates/base.html.twig):
<script src="{{ asset('bundles/sonatamediawebcamprovider/sonata-media-webcam-provider.min.js') }}"></script>
Configure SonataMediaBundle
Update config/packages/sonata_media.yaml:
sonata_media:
contexts:
default:
providers:
- sonata.media.provider.webcam
webcam as the provider.Admin Form Integration
# config/packages/sonata_media.yaml
sonata_media:
types:
my_webcam_type:
provider: sonata.media.provider.webcam
formats: [small, medium, large]
Handling Captures
sonata-media-webcam-provider.min.js) handles:
<canvas>.ImageProvider.Validation & Fallbacks
validate() method:
public function validate(MediaInterface $media)
{
if ($media->getProviderName() === 'sonata.media.provider.webcam') {
$this->validateWebcamDimensions($media);
}
}
Customizing the Webcam UI
{# templates/SonataMediaWebcamProvider/webcam.html.twig #}
<button id="sonata-media-webcam-capture" class="btn btn-primary">
{{ 'Capture from Webcam'|trans }}
</button>
data-sonata-media-webcam-options:
<div data-sonata-media-webcam-options='{"width": 640, "height": 480}'>
{# Webcam container #}
</div>
Programmatic Usage
$('#sonata-media-webcam-capture').click();
$(document).on('sonata.media.webcam.captured', function(e, data) {
console.log('Captured image:', data.base64);
});
Webcam Permissions
Temporary File Handling
sys_temp_dir in sonata_media.yaml is writable.Filesystem component manages this).Image Processing
sonata_media formats:
sonata_media:
formats:
small: { width: 100, quality: 70 } # Force JPEG
Symfony 5+ Flex Compatibility
assets:install is run post-install.php bin/console assets:install --no-debug.Debugging Captures
NotAllowedError for webcam access).console.log(event.detail.base64.substring(0, 100) + '...');
Performance
data-sonata-media-webcam-options='{"width": 800, "height": 600}'
Fallback UX
{% if not app.request.isXmlHttpRequest %}
<div class="alert alert-warning">
{{ 'Webcam not available. Upload a file manually.'|trans }}
</div>
{% endif %}
Testing
sonata.media.provider.webcam events:
$this->get('event_dispatcher')->dispatch(
new MediaWebcamCapturedEvent($media, $base64Image)
);
Extending Functionality
sonata_media:
providers:
sonata.media.provider.webcam:
filters:
- sonata.media.filter.image
- app.custom_webcam_filter
Security
use Symfony\Component\HttpFoundation\File\UploadedFile;
$tempFile = tempnam(sys_get_temp_dir(), 'sonata_webcam_');
file_put_contents($tempFile, base64_decode($base64Image));
$uploadedFile = new UploadedFile($tempFile, 'webcam_capture.jpg');
$this->validateFile($uploadedFile);
How can I help you explore Laravel packages today?