common-gateway/huwelijksplanner-bundle
## Getting Started
### Minimal Setup
1. **Installation**
```bash
composer require common-gateway/huwelijksplanner-bundle
Add the bundle to config/bundles.php:
return [
// ...
CommonGateway\HuwelijksplannerBundle\HuwelijksplannerBundle::class => ['all' => true],
];
Configuration
Load the default config via config/packages/huwelijksplanner.yaml (auto-generated). Override as needed:
huwelijksplanner:
plugins:
- CommonGateway\Huwelijksplanner\Plugin\MarriageRegistrationPlugin
- CommonGateway\Huwelijksplanner\Plugin\WeddingLocationPlugin
api:
base_uri: '%env(HUWELIJKSPLANNER_API_URL)%'
First Use Case: Marriage Request Flow Trigger the marriage registration workflow via a controller:
use CommonGateway\HuwelijksplannerBundle\Service\MarriageWorkflow;
public function startMarriageRequest(MarriageWorkflow $workflow)
{
$request = $workflow->createRequest([
'partner1' => ['bsn' => '123456789', 'name' => 'Doe, John'],
'partner2' => ['bsn' => '987654321', 'name' => 'Smith, Jane'],
]);
return $this->redirectToRoute('huwelijksplanner.marriage_steps', ['id' => $request->getId()]);
}
Plugin-Based Architecture
huwelijksplanner:
plugins:
- { name: MarriageRegistrationPlugin, enabled: true }
- { name: WeddingLocationPlugin, enabled: false }
PluginInterface:
class CustomValidationPlugin implements PluginInterface
{
public function validate(MarriageRequest $request): bool
{
// Custom logic
}
}
API Integration
HuwelijksplannerApiClient to interact with municipal APIs:
$client = $this->container->get('huwelijksplanner.api_client');
$response = $client->get('/marriage-status', ['bsn' => '123456789']);
MarriageApprovedEvent) in your services:
public function __construct(HuwelijksplannerEvents $events)
{
$events->on('marriage.approved', [$this, 'notifyCouple']);
}
Form Handling
MarriageStepHandler for multi-step forms:
$handler = new MarriageStepHandler($request);
$form = $handler->getCurrentStepForm(); // Returns FormInterface
BSNValidator, AgeValidator) or extend:
$validator = new CustomValidator();
$errors = $validator->validate($request);
Data Persistence
MarriageRequest or WeddingLocation entities:
#[ORM\Entity]
class CustomMarriageRequest extends MarriageRequest
{
#[ORM\Column]
private string $customField;
}
MarriageRequestRepository for CRUD operations:
$request = $repository->find($id);
$repository->save($request);
Plugin Loading Order
WeddingLocationPlugin needs MarriageRegistrationPlugin).priority in config:
plugins:
- { name: MarriageRegistrationPlugin, priority: 10 }
- { name: WeddingLocationPlugin, priority: 20 }
BSN Validation
BSNValidator is strict (Dutch BSN format only). Custom formats may fail.$validator = new BSNValidator();
$validator->setStrict(false); // Temporarily disable strict checks
API Rate Limiting
HuwelijksplannerApiClient:
$client = new HuwelijksplannerApiClient($httpClient, [
'max_retries' => 3,
'delay' => 1000,
]);
Entity Inheritance
MarriageRequest may cause hydration issues if properties aren’t mapped.@ORM\Attribute annotations explicitly:
#[ORM\Column(name: 'custom_field', type: 'string')]
private string $customField;
Event Listener Debugging
config/packages/dev/huwelijksplanner.yaml:
huwelijksplanner:
debug:
events: true
MarriageRequestCreatedEvent).API Debugging
$client = new HuwelijksplannerApiClient($httpClient, [
'logger' => $this->container->get('monolog.logger.huwelijksplanner'),
]);
Form Debugging
{% for error in form.errors %}
{{ error.message }}
{% endfor %}
Custom Validators
services:
App\Validator\CustomMarriageValidator:
tags: [huwelijksplanner.validator]
API Response Transformers
ApiResponseTransformer to modify responses:
$transformer = new CustomApiResponseTransformer();
$client->setTransformer($transformer);
Workflow Steps
StepInterface:
class CustomStep implements StepInterface
{
public function getName(): string { return 'custom_step'; }
public function render(TemplateRenderer $renderer): string { /* ... */ }
}
huwelijksplanner:
workflow:
steps:
- App\Step\CustomStep
Municipality-Specific Logic
MunicipalityContext service to inject location-specific rules:
$context = $this->container->get('huwelijksplanner.municipality_context');
if ($context->isAmsterdam()) {
// Custom Amsterdam rules
}
```markdown
### Configuration Quirks
1. **Environment Variables**
- The bundle expects `HUWELIJKSPLANNER_API_URL` and `HUWELIJKSPLANNER_MUNICIPALITY_CODE` in `.env`. If missing, the bundle throws a `RuntimeException`.
- **Fix**: Set defaults in `config/packages/huwelijksplanner.yaml`:
```yaml
api:
base_uri: '%env(default::HUWELIJKSPLANNER_API_URL)%'
```
2. **Doctrine Migrations**
- Running migrations after extending entities may fail if the bundle’s schema isn’t updated first.
- **Fix**: Run the bundle’s migrations first:
```bash
php bin/console doctrine:migrations:execute --up --query="SELECT * FROM migration_version WHERE version = 'CommonGatewayHuwelijksplannerBundle'"
```
3. **Caching**
- The bundle caches API responses by default. Clear cache after plugin changes:
```bash
php bin/console cache:clear huwelijksplanner
```
### Performance Tips
1. **Batch Processing**
- Use `MarriageRequestBatchProcessor` for bulk operations:
```php
$processor = new MarriageRequestBatchProcessor($repository);
$processor->process($requests, 50); // Batch size of 50
```
2. **Lazy Loading**
- Enable lazy loading for large datasets:
```php
$requests = $repository->findBy([], [], 100, 0, ['partner1' => 'ASC']);
```
3. **API Caching**
- Cache frequent
How can I help you explore Laravel packages today?