Installation
composer require black/common-bundle
Add to config/bundles.php (Symfony):
return [
// ...
Black\CommonBundle\BlackCommonBundle::class => ['all' => true],
];
First Use Case: Events
use Black\CommonBundle\Event\CommonEvent;
$event = new CommonEvent();
$dispatcher->dispatch($event, CommonEvent::NAME);
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class MySubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
CommonEvent::NAME => 'onCommonEvent',
];
}
public function onCommonEvent(CommonEvent $event)
{
// Handle event logic
}
}
First Use Case: Transformers
use Black\CommonBundle\Transformer\TransformerInterface;
$transformer = new MyTransformer();
$data = $transformer->transform($entity);
Event-Driven Architecture
// Dispatch an event after saving an entity
$entityManager->persist($entity);
$entityManager->flush();
$event = new CommonEvent($entity);
$dispatcher->dispatch($event, CommonEvent::ENTITY_SAVED);
// Example: Log all entity saves
class LoggingSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [CommonEvent::ENTITY_SAVED => 'logEntitySave'];
}
public function logEntitySave(CommonEvent $event)
{
\Log::info('Entity saved:', ['entity' => $event->getEntity()]);
}
}
Data Transformation
// Define a transformer for a User entity
class UserTransformer implements TransformerInterface
{
public function transform($user)
{
return [
'id' => $user->getId(),
'name' => $user->getName(),
'email' => $user->getEmail(),
];
}
}
public function show(User $user, UserTransformer $transformer)
{
return $this->json($transformer->transform($user));
}
Type Safety with Interfaces
// Define an interface for a service
interface UserServiceInterface
{
public function findByEmail(string $email): ?User;
}
class UserService implements UserServiceInterface
{
public function findByEmail(string $email): ?User
{
// Logic here
}
}
Extensions
// Example: Extend a transformer with additional fields
class ExtendedUserTransformer extends UserTransformer
{
public function transform($user)
{
$data = parent::transform($user);
$data['roles'] = $user->getRoles();
return $data;
}
}
Archived Status
Limited Documentation
Resources/doc/index.md is the primary source, but it may lack depth or examples.Event Naming Collisions
COMMON_BUNDLE.ENTITY_SAVED).Transformer Flexibility
Event Dispatching Issues
php bin/console debug:event-dispatcher
Transformer Output
var_dump() or dd() to inspect transformed data:
$transformed = $transformer->transform($entity);
dd($transformed);
Bundle Configuration
config/packages/black_common.yaml, but check for optional settings in the docs.config/services.yaml if needed:
services:
Black\CommonBundle\Transformer\UserTransformer:
tags: ['black.common.transformer']
Dependency Injection
TransformerInterface are tagged or autowired properly.# config/services.yaml
_defaults:
autowire: true
autoconfigure: true
Custom Events
CommonEvent class for domain-specific events:
class OrderProcessedEvent extends CommonEvent
{
public const NAME = 'order.processed';
public function __construct(private Order $order)
{
parent::__construct();
}
public function getOrder(): Order
{
return $this->order;
}
}
Transformer Decorators
class CachingUserTransformer implements TransformerInterface
{
private $decorated;
public function __construct(TransformerInterface $decorated)
{
$this->decorated = $decorated;
}
public function transform($user)
{
$data = $this->decorated->transform($user);
// Add caching logic
return $data;
}
}
config/services.yaml:
services:
App\Transformer\CachingUserTransformer:
decorates: 'black.common.transformer.user'
arguments: ['@App\Transformer\CachingUserTransformer.inner']
Event Listeners as Services
# config/services.yaml
services:
App\EventListener\OrderListener:
tags:
- { name: kernel.event_listener, event: order.processed, method: onOrderProcessed }
How can I help you explore Laravel packages today?