simple-bus/jms-serializer-bridge
Bridge for SimpleBus Serialization that implements the ObjectSerializer interface using JMSSerializer. Use it to serialize and deserialize message objects in SimpleBus-based applications with a familiar JMS Serializer backend.
Install Dependencies:
composer require simple-bus/jms-serializer-bridge jms/serializer
jms/serializer is a required peer dependency.Configure JMSSerializer:
Add a configuration file (e.g., config/jms_serializer.php) or use Symfony’s YAML setup:
# config/packages/jms_serializer.yaml (Symfony-style)
jms_serializer:
metadata:
directories:
- %kernel.project_dir%/config/serializer
serializer directory in your project root and define metadata for your message classes (e.g., MyMessage.yaml):
App\Messages\MyMessage:
exclusion_policy: ALL
properties:
id:
expose: true
type: integer
name:
expose: true
type: string
Bind the Serializer: Register the bridge in a Laravel service provider:
use SimpleBus\Serialization\Serializer;
use SimpleBus\JMSSerializerBridge\JMSSerializer;
public function register()
{
$this->app->singleton(Serializer::class, function ($app) {
return new JMSSerializer();
});
}
First Use Case: Serialize a message in a job or command:
use SimpleBus\Serialization\Serializer;
class SendMessageJob implements ShouldQueue
{
public function __construct(
private MyMessage $message,
private Serializer $serializer
) {}
public function handle()
{
$serialized = $this->serializer->serialize($this->message);
// Store or send $serialized (e.g., to a queue)
}
}
Message-Driven Architecture:
$serializer->serialize($message); // Convert to string for queue/storage
$deserialized = $serializer->deserialize($serializedString, MyMessage::class);
Queue::push(function () use ($serializer, $message) {
$serialized = $serializer->serialize($message);
// Store $serialized in DB/Redis
});
Event Serialization:
// Before: json_encode($event)
// After:
$serializer->serialize($event);
DTO Handling:
class UserProfileDto {
public function __construct(
public User $user,
public array $permissions
) {}
}
User and permissions in YAML.Integration with SimpleBus:
$bus = new SimpleBus\Message\Bus\MessageBus(
new SimpleBus\Message\Bus\Plugin\Router(),
new SimpleBus\Message\Bus\Plugin\HandlerResolution\HandlerResolutionPlugin(),
new SimpleBus\Message\Bus\Plugin\LoggingPlugin(),
new SimpleBus\Message\Bus\Plugin\SerializationPlugin($serializer)
);
Queue Job Serialization:
class CustomJobSerializer implements ShouldQueue
{
public function __construct(private Serializer $serializer) {}
public function handle()
{
$this->serializer->serialize($this);
}
public function serialize(): string
{
return $this->serializer->serialize($this);
}
public static function deserialize($data): self
{
return $this->serializer->deserialize($data, static::class);
}
}
Middleware for API ↔ Message Bridge:
$serializer->serialize($request->all()); // For outgoing messages
$deserialized = $serializer->deserialize($messageString, MyRequestDto::class);
Testing:
$serializer = $this->createMock(Serializer::class);
$serializer->method('serialize')->willReturn('serialized_string');
$serializer->method('deserialize')->willReturn(new MyMessage());
Metadata Caching:
$serializer = new JMSSerializer([
'metadata' => [
'cache_dir' => storage_path('framework/cache/jms_serializer'),
],
]);
Batch Processing:
$serializer = app(Serializer::class);
foreach ($messages as $message) {
$serializer->serialize($message);
}
Lazy Loading:
public function handle()
{
$this->delay(fn() => $this->serializer->serialize($this));
}
Unserializable Types:
@Serializer\Type annotations:
App\Models\User:
properties:
created_at:
type: DateTime<'Y-m-d H:i:s'>
class LaravelDto {
public Carbon $createdAt;
public Collection $relations;
}
Circular References:
User->posts->author->user) cause infinite loops.App\Models\User:
max_depth: 2
Property Visibility:
properties:
secretKey:
expose: true
type: string
serialized_name: secret_key
Namespace Conflicts:
Illuminate\Support\* classes.Illuminate\Support\Collection:
properties:
items:
type: array
Queue Driver Incompatibilities:
base64_encode($serialized) before storage and decode on retrieval.Enable Verbose Logging:
$serializer = new JMSSerializer([
'handlers' => [
'date_time_handler' => [
'format' => 'Y-m-d H:i:s',
],
],
'debug' => true,
]);
Validate Metadata:
jms/serializer-bundle CLI tool (Symfony) or create a custom Artisan command:
php artisan jms:validate-metadata
Inspect Serialized Output:
\Log::debug('Serialized:', ['data' => $serializer->serialize($message)]);
Deserialization Errors:
YAML vs. PHP Configuration:
$serializer = new JMSSerializer([
'metadata' => [
'directories' => [__DIR__.'/config/serializer'],
],
'handlers' => [
'App\Handlers\CustomHandler',
],
]);
Laravel Cache Integration:
$cache = Cache::store('file');
$serializer = new JMSSerializer([
'metadata' => [
'cache' => $cache,
],
]);
Environment-Specific Config:
$config = config('jms_serializer', []);
$serializer = new JMSSerializer($config);
How can I help you explore Laravel packages today?