baudev/php-object-converter-bundle
Installation:
composer require baudev/php-object-converter-bundle
For Symfony Flex projects, the bundle auto-enables. For manual setups, add it to AppKernel.php.
First Use Case:
Convert a PHP class (e.g., User) to another language (e.g., JavaScript). Run:
bin/console converter:generate converter User src/Converter/Output
converter: The command name (default in the bundle).User: Your source PHP class (must be autoloadable).src/Converter/Output: Target directory for generated files.Where to Look First:
config/packages/baudev_php_object_converter.yaml for default configurations (e.g., supported languages, naming conventions).Output/ to understand the output structure.Class-to-Language Conversion:
converter:generate command to serialize PHP classes into target languages (e.g., TypeScript, Java, C#).bin/console converter:generate converter User src/Converter/Output --language=typescript
config/packages/baudev_php_object_converter.yaml).Integration with Laravel (Symfony-Compatible):
config/app.php:
'bindings' => [
Baudev\PHPObjectConverterBundle\Converter\ConverterInterface::class => Baudev\PHPObjectConverterBundle\Converter\Converter::class,
],
use Baudev\PHPObjectConverterBundle\Converter\ConverterInterface;
class MyService {
public function __construct(private ConverterInterface $converter) {}
public function convertUserToJson(User $user) {
$converted = $this->converter->convert($user, 'json');
return json_decode($converted, true);
}
}
Customizing Output:
Twig environment (if supported) or by modifying the converter:generate command’s arguments.bin/console converter:generate converter User src/Converter/Output --class-name-prefix="Dto_"
Event-Driven Conversion:
use Symfony\Component\Console\Event\ConsoleTerminateEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ConversionSubscriber implements EventSubscriberInterface {
public static function getSubscribedEvents() {
return [
'console.terminate' => 'onConversionTerminate',
];
}
public function onConversionTerminate(ConsoleTerminateEvent $event) {
if ($event->getCommand()->getName() === 'converter:generate') {
// Post-process generated files (e.g., minify JS, lint TS).
}
}
}
API Response Conversion:
$user = User::find(1);
$graphqlType = $this->converter->convert($user, 'graphql');
Deprecated Bundle:
Limited Language Support:
Converter class and register it in the bundle’s configuration.Command Argument Sensitivity:
converter:generate command is strict about class names and paths. Use fully qualified names (e.g., App\Models\User) to avoid autoloading issues.storage/ or app/ are safe choices.Circular References:
User ↔ Post). Handle manually or pre-process data:
$user = User::with('posts')->find(1);
$this->converter->convert($user, 'json', ['maxDepth' => 1]);
Configuration Overrides:
config/packages/baudev_php_object_converter.yaml are merged, not replaced. Use !override for precedence:
baudev_php_object_converter:
languages:
typescript: !override
template: 'custom_ts_template.twig'
Dry Runs:
--dry-run (if supported) to preview changes without writing files:
bin/console converter:generate converter User --dry-run
Logging:
APP_DEBUG=true) to log conversion errors. Check var/log/dev.log in Laravel.Template Debugging:
config/packages/twig.yaml:
twig:
debug: true
strict_variables: true
Fallback to Raw Conversion:
json_encode or serialize:
$raw = $this->converter->convert($user, 'json', ['fallback' => true]);
Custom Converters:
Baudev\PHPObjectConverterBundle\Converter\ConverterInterface for new languages. Example:
class RustConverter implements ConverterInterface {
public function convert($object, array $options = []): string {
// Custom logic to convert PHP to Rust structs.
return "pub struct User {\n pub id: i32,\n}";
}
}
services:
Baudev\PHPObjectConverterBundle\Converter\ConverterInterface:
alias: 'app.rust_converter'
public: true
Pre/Post-Processing:
booted event to hook into the bundle’s lifecycle:
use Baudev\PHPObjectConverterBundle\Event\ConversionEvent;
public function boot() {
event(new ConversionEvent($user, 'json'));
// Trigger custom logic before/after conversion.
}
Testing:
$this->mock(Baudev\PHPObjectConverterBundle\Converter\ConverterInterface::class)
->shouldReceive('convert')
->once()
->andReturn('{"id":1}');
How can I help you explore Laravel packages today?