alphasoft-fr/messenger-filesystem-transport
composer require alphasoft-fr/messenger-filesystem-transport
config/bundles.php:
return [
// ...
\AlphaSoft\Messenger\FilesystemTransport\AsMessengerFilesystemTransportBundle::class => ['all' => true],
];
config/packages/messenger.yaml):
framework:
messenger:
transports:
filesystem:
dsn: 'filesystem://'
options:
directory: '%kernel.project_dir%/var/messages'
Dispatch a message asynchronously:
use Symfony\Component\Messenger\MessageBusInterface;
class MyService {
public function __construct(private MessageBusInterface $bus) {}
public function triggerAsyncTask() {
$this->bus->dispatch(new MyMessage());
}
}
Messages will auto-persist to var/messages/ as JSON files.
Transport Routing:
Use async bus for filesystem transport:
# messenger.yaml
framework:
messenger:
buses:
async:
default_middleware: allow_no_handlers
transports: [filesystem]
Handling Failed Messages:
Configure a failed transport:
transports:
filesystem: { ... }
failed:
dsn: 'filesystem://'
options:
directory: '%kernel.project_dir%/var/messages/failed'
Worker Setup: Run the worker via CLI:
php bin/console messenger:consume filesystem -vv
RetryStrategy middleware for transient failures.YYYYMMDD_HHMMSS_UID.json).glob('var/messages/*.json')).var/messages/.log: true to track processed.log/failed.log.Directory Permissions:
Ensure var/messages/ is writable by PHP-FPM/CLI user.
chmod -R 775 var/messages
Message Size Limits: Large messages (>1MB) may cause performance issues. Consider:
gzip_encode).Concurrent Workers: Without locking, multiple workers may process the same file. Use:
options:
directory: '%kernel.project_dir%/var/messages'
lock_timeout: 300 # 5-minute lock (default: 0)
.lock suffixes).--time-limit=0 to avoid timeouts.Custom Serialization:
Override SerializerInterface to handle non-JSON payloads:
// config/packages/messenger.yaml
options:
serializer: App\CustomSerializer
Event Listeners:
Subscribe to MessageSentToTransportEvent to log/validate messages:
use Symfony\Component\Messenger\Event\MessageSentToTransportEvent;
public function onMessageSent(MessageSentToTransportEvent $event) {
if ($event->getTransport() instanceof FilesystemTransport) {
// Custom logic
}
}
Storage Backend:
Extend FilesystemTransport to support cloud storage (e.g., S3) by overriding store()/recover().
%kernel.project_dir% for portability.processed.log/failed.log sizes.YYYYMMDD_HHMMSS_UID (adjust via Serializer if needed).log: false in production.
```markdown
## Laravel-Specific Adaptations
### Laravel Integration
1. **Service Provider**:
Register the bundle in `config/app.php`:
```php
'providers' => [
// ...
\AlphaSoft\Messenger\FilesystemTransport\AsMessengerFilesystemTransportBundle::class,
],
Laravel Messenger:
Configure in config/messenger.php:
'transports' => [
'filesystem' => [
'dsn' => 'filesystem://',
'options' => [
'directory' => storage_path('app/messages'),
],
],
],
Dispatching Messages:
Use Laravel’s Bus facade:
use Illuminate\Bus\Dispatcher;
$dispatcher = app(Dispatcher::class);
$dispatcher->dispatch(new MyMessage());
Storage Path:
Ensure storage_path('app/messages') exists and is writable.
Queue Workers: Run the worker via Artisan:
php artisan messenger:consume filesystem
Event Handling:
Use Laravel’s HandleFailedJobs middleware for failed messages.
$messages = Storage::files('app/messages');
$content = Storage::get($messages[0]);
failed.log to use Laravel’s logging:
'options' => [
'log' => true,
'log_channel' => 'single',
],
Custom Events:
Listen to Illuminate\Queue\Events\JobProcessed for post-processing.
Queue Connection:
Extend Laravel’s FilesystemQueue to integrate with this transport.
Horizon Compatibility:
Use horizon:consume with the filesystem connection.
How can I help you explore Laravel packages today?